私はデータフレームを持っています:
df = pd.DataFrame({'ID':[1,1,2,2,3,3],
'YEAR' : [2011,2012,2012,2013,2013,2014],
'V': [0,1,1,0,1,0],
'C':[00,11,22,33,44,55]})
IDでグループ化し、各グループ内でV = 0の行を選択します。
これはうまくいかないようです:
print(df.groupby(['ID']).filter(lambda x: x['V'] == 0))
エラーが発生しました:
TypeError:フィルター関数がSeriesを返しましたが、スカラーboolが必要です
フィルターを使用して目標を達成するにはどうすればよいですか?ありがとうございました。
[〜#〜] edit [〜#〜]:Vの条件はグループごとに異なる場合があります。たとえば、ID 1の場合はV == 0、ID 2の場合はV == 1になります。この情報は別のDFから入手できます。
df = pd.DataFrame({'ID':[1,2,3],
'V': [0,1,0])
では、各グループ内で行フィルタリングを行う方法は?
groupby
は不要だと思います。V
がboolean indexing
であるすべての行が必要な場合のみ、 0
を使用してください。
print (df[df.V == 0])
C ID V YEAR
0 0 1 0 2011
3 33 2 0 2013
5 55 3 0 2014
ただし、列の少なくとも1つの値V
が等しい0
を追加してすべてのグループを返す必要がある場合は、グループ内のすべての行をフィルタリングするために filter にany
またはTrue
が必要であるため、次のようにFalse
を追加します。
print(df.groupby(['ID']).filter(lambda x: (x['V'] == 0).any()))
C ID V YEAR
0 0 1 0 2011
1 11 1 1 2012
2 22 2 1 2012
3 33 2 0 2013
4 44 3 1 2013
5 55 3 0 2014
テストには、groupby
の列を変更することをお勧めします。2012
がないため、V==0
のある行は除外されます。
print(df.groupby(['YEAR']).filter(lambda x: (x['V'] == 0).any()))
C ID V YEAR
0 0 1 0 2011
3 33 2 0 2013
4 44 3 1 2013
5 55 3 0 2014