pandas
データフレームのブールインデックス
サーチ…
前書き
データフレームのインデクサを使用して、データフレーム内の行にアクセスすると、オブジェクト.ix
、 .loc
、 .iloc
とどのようにそれがboolean型マスクを使用してから自分自身を区別します。
ブールインデックスを使用したDataFrameへのアクセス
これは私たちのサンプルデータフレームになります:
df = pd.DataFrame({"color": ['red', 'blue', 'red', 'blue']},
index=[True, False, True, False])
color
True red
False blue
True red
False blue
.loc
アクセスする
df.loc[True]
color
True red
True red
.iloc
アクセスする
df.iloc[True]
>> TypeError
df.iloc[1]
color blue
dtype: object
重要なことは、古いパンダバージョンではブール値と整数の入力を区別できないため、
.iloc[True]
は.iloc[1]
と同じ結果を.iloc[1]
.ix
アクセスする
df.ix[True]
color
True red
True red
df.ix[1]
color blue
dtype: object
ご覧のとおり、 .ix
は2つの動作があります。これはコードでは非常に悪いことであり、避けるべきです。より明示的に使用するには、 .iloc
または.loc
を使用してください。
ブーリアンマスクをデータフレームに適用する
これは私たちのサンプルデータフレームになります:
color name size
0 red rose big
1 blue violet big
2 red tulip small
3 blue harebell small
魔法の__getitem__
または[]
アクセサを使用しています。データフレームと同じ長さの真と偽のリストを与えると、次のようになります。
df[[True, False, True, False]]
color name size
0 red rose big
2 red tulip small
列値に基づいたデータのマスキング
これは私たちのサンプルデータフレームになります:
color name size
0 red rose big
1 blue violet small
2 red tulip small
3 blue harebell small
データフレームから単一の列にアクセスすると、簡単な比較==
を使用して、列の各要素を指定された変数と比較して、真と偽のpd.Series
を生成するpd.Series
ができます
df['size'] == 'small'
0 False
1 True
2 True
3 True
Name: size, dtype: bool
このpd.Series
は、単純なlist
拡張であるnp.array
の拡張です。したがって、これを上記の例のように__getitem__
または[]
アクセサに__getitem__
ことができます。
size_small_mask = df['size'] == 'small'
df[size_small_mask]
color name size
1 blue violet small
2 red tulip small
3 blue harebell small
インデックス値に基づくマスキングデータ
これは私たちのサンプルデータフレームになります:
color size
name
rose red big
violet blue small
tulip red small
harebell blue small
列の値と同様に、インデックス値に基づいてマスクを作成できます。
rose_mask = df.index == 'rose'
df[rose_mask]
color size
name
rose red big
しかし、これを実行することは、ほぼ同じです
df.loc['rose']
color red
size big
Name: rose, dtype: object
重要な違いは、 .loc
が一致するインデックス内の1つの行のみをpd.Series
すると、 pd.DataFrame
が返されます。一致する行が増えた場合、 pd.DataFrame
が返されます。これは、この方法をむしろ不安定にする。
この動作は、 .loc
単一のエントリのリストを与えることで制御できます。これにより、データフレームが返されます。
df.loc[['rose']]
color size
name
rose red big