1. ホーム
  2. パイソン

[解決済み】Python Pandas。特定の値に一致するカラムを持つ行のインデックスを取得する

2022-03-24 06:53:35

質問

BoolCol列を持つDataFrameが与えられたとき、BoolCol列の値が真であるDataFrameのインデックスを求めたい。

現在、私はそれを行うために反復する方法を持っており、それは完全に動作します。

for i in range(100,3000):
    if df.iloc[i]['BoolCol']== True:
         print i,df.iloc[i]['BoolCol']

しかし、これは正しいパンダのやり方ではありません。 いろいろ調べた結果、現在はこのコードを使っています。

df[df['BoolCol'] == True].index.tolist()

これは、インデックスのリストを与えてくれますが、実行によってチェックすると、一致しません。

df.iloc[i]['BoolCol']

結果は、実はFalse!

Pandasでこれを行うには、どちらが正しいのでしょうか?

どのように解決するのですか?

df.iloc[i] が返されます。 ith の行 df . i はインデックスラベルを参照しない。 i は0基準のインデックスです。

それに対して 属性は index は実際のインデックスラベルを返します。 数値の行インデックスではありません。

df.index[df['BoolCol'] == True].tolist()

またはそれに準ずるもの。

df.index[df['BoolCol']].tolist()

を持つDataFrameで遊んでみると、その違いがよくわかると思います。 行の数値位置と等しくないデフォルトでないインデックスを指定します。

df = pd.DataFrame({'BoolCol': [True, False, False, True, True]},
       index=[10,20,30,40,50])

In [53]: df
Out[53]: 
   BoolCol
10    True
20   False
30   False
40    True
50    True

[5 rows x 1 columns]

In [54]: df.index[df['BoolCol']].tolist()
Out[54]: [10, 40, 50]


インデックスを使用する場合 ,

In [56]: idx = df.index[df['BoolCol']]

In [57]: idx
Out[57]: Int64Index([10, 40, 50], dtype='int64')

を使用すると、行を選択することができます。 loc の代わりに iloc :

In [58]: df.loc[idx]
Out[58]: 
   BoolCol
10    True
40    True
50    True

[3 rows x 1 columns]


注意事項 loc は、ブーリアン配列も受け入れることができます。 :

In [55]: df.loc[df['BoolCol']]
Out[55]: 
   BoolCol
10    True
40    True
50    True

[3 rows x 1 columns]


ブーリアン配列がある場合。 mask を使って計算することができます。 np.flatnonzero :

In [110]: np.flatnonzero(df['BoolCol'])
Out[112]: array([0, 3, 4])

使用方法 df.iloc は、序数で行を選択する。

In [113]: df.iloc[np.flatnonzero(df['BoolCol'])]
Out[113]: 
   BoolCol
10    True
40    True
50    True