我有以下数据框:
idx val1
1 1
1 2
1 3
2 4
2 5
2 6
我想执行以下操作:
从val1列中返回所有大于组平均值(由groupby返回的组)的值
例如 组1(idx = 1)的均值= 2,第二组的均值=5。因此,我想得到以下信息:组1的2,3(2> = 2,3> = 2),而第2组则为5,6。
我尝试了以下操作:
df.groupby('idx').filter(lambda x: x['val'] >= np.mean(x['val1']))
有没有一种方法可以通过使用单个groupby和单个过滤器方法来实现?
答案 0 :(得分:1)
此处filtration
用于按某个标量删除组的所有值,例如2
:
df1 = df.groupby('idx').filter(lambda x: x['val1'].mean() > 2)
print (df1)
idx val1
3 2 4
4 2 5
5 2 6
但是,如果要每组按mean
删除行,则将GroupBy.transform
与mean
一起使用,返回Series
的大小与原始df
相同,并按boolean indexing
:
df2 = df[df['val1'] >= df.groupby('idx')['val1'].transform('mean')]
print (df2)
idx val1
1 1 2
2 1 3
4 2 5
5 2 6
详细信息:
print (df.groupby('idx')['val1'].transform('mean'))
0 2
1 2
2 2
3 5
4 5
5 5
Name: val1, dtype: int64
print (df['val1'] >= df.groupby('idx')['val1'].transform('mean'))
0 False
1 True
2 True
3 False
4 True
5 True
Name: val1, dtype: bool