"BoolCol"という列を持つDataFrameがあるとすると、 "BoolCol"の値がTrueである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
Numpy where()関数を使用して実行できます。
import pandas as pd
import numpy as np
In [716]: df = pd.DataFrame({"gene_name": ['SLC45A1', 'NECAP2', 'CLIC4', 'ADC', 'AGBL4'] , "BoolCol": [False, True, False, True, True] },
index=list("abcde"))
In [717]: df
Out[717]:
BoolCol gene_name
a False SLC45A1
b True NECAP2
c False CLIC4
d True ADC
e True AGBL4
In [718]: np.where(df["BoolCol"] == True)
Out[718]: (array([1, 3, 4]),)
In [719]: select_indices = list(np.where(df["BoolCol"] == True)[0])
In [720]: df.iloc[select_indices]
Out[720]:
BoolCol gene_name
b True NECAP2
d True ADC
e True AGBL4
あなたは必ずしも試合のためにインデックスを必要としませんが、あなたが必要とするならば、ケースを入れてください。
In [796]: df.iloc[select_indices].index
Out[796]: Index([u'b', u'd', u'e'], dtype='object')
In [797]: df.iloc[select_indices].index.tolist()
Out[797]: ['b', 'd', 'e']
ターゲットカラムがquery
型である場合、まずbool
をチェックしてください(PS:使い方については link をチェックしてください)
df.query('BoolCol')
Out[123]:
BoolCol
10 True
40 True
50 True
元のdfをブール列でフィルタした後、インデックスを選択できます。
df=df.query('BoolCol')
df.index
Out[125]: Int64Index([10, 40, 50], dtype='int64')
またパンダはnonzero
を持っています、我々はちょうどTrue
行のpositionを選択し、それを使ってDataFrame
またはindex
をスライスします
df.index[df.BoolCol.nonzero()[0]]
Out[128]: Int64Index([10, 40, 50], dtype='int64')
簡単な方法は、フィルタリングの前にDataFrameのインデックスをリセットすることです。
df_reset = df.reset_index()
df_reset[df_reset['BoolCol']].index.tolist()
ちょっとハックですが、速いです!