[英]Filter pandas dataframe by comparing column to multiindex group
我有一個像下面的pandas DataFrame:
df = pandas.DataFrame({'A' : ['foo', 'foo', 'foo', 'foo', 'bar', 'bar', \
'bar', 'bar', 'baz', 'baz', 'baz', 'baz'],\
'B' : ['one', 'one', 'two', 'two', 'one', 'one', \
'two', 'two', 'one', 'one', 'two', 'two'],\
'C' : pandas.np.random.randn(12)})
df
A B C
0 foo one -0.241101
1 foo one -0.658436
2 foo two 0.300752
3 foo two -0.589445
4 bar one 1.775511
5 bar one 0.068603
6 bar two -0.464550
7 bar two -0.621055
8 baz one -1.469311
9 baz one 0.490963
10 baz two -0.606491
11 baz two -0.006323
我想要做的是過濾C中小於組(A,B)平均值的那些值。
分組工作:
groups = df.groupby([df.A, df.B])
upper_bound = groups.C.mean()
upper_bound
A B
bar one 0.922057
two -0.542803
baz one -0.489174
two -0.306407
foo one -0.449768
two -0.144346
Name: C, dtype: float64
但是我現在如何過濾,以便(在本例中)將刪除第1 foo one -0.658436
行1 foo one -0.658436
我嘗試了以下操作:
df_ = df.loc[df.C <= upper_bound.loc[df.A, df.B]]
但這說
'None of [0 foo\n1 foo\n2 foo\n3 foo\n4 bar\n5 bar\n6 bar\n7 bar\n8 baz\n9 baz\n10 baz\n11 baz\nName: A, dtype: object] are in the [index]'
我嘗試過:
df_ = df.loc[df.C <= upper_bound[df.A, df.B]]
這給了我:
pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:3824)()
pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:3492)()
TypeError:
我這樣做的原因是因為我已經(至少我認為)設法做到了“相同”的事情,但只有一個級別的小組:
groups = df.groupby([df.A])
upper_bound = groups.C.mean()
df_ = df.loc[df.C <= upper_bound.loc[df.A]
實際上,它消除了df中C低於upper_bound的所有內容。
有什么想法我做錯了嗎?
您將groupby upper_bound
的結果與df['C']
,但是它們具有不同數量的元素。 使用transform
使每個組中存在的每行均值,並將其與df['C']
。 使用loc
塗抹此面膜:
import numpy as np
df.loc[df['C']>=df.groupby(['A','B']).transform(np.mean)['C'],]
Out[13]:
A B C
0 foo one 0.579987
3 foo two 1.701136
5 bar one 1.955158
7 bar two 0.943862
9 baz one -0.628506
10 baz two 1.097203
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.