web-dev-qa-db-ja.com

Pandas groupby and filter

私はデータフレームを持っています:

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])

では、各グループ内で行フィルタリングを行う方法は?

8
iwbabn

groupbyは不要だと思います。Vboolean 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を追加してすべてのグループを返す必要がある場合は、グループ内のすべての行をフィルタリングするために filteranyまたは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
9
jezrael