有没有一种方法可以对熊猫分组依据结果进行逐元素过滤?

时间:2019-10-28 14:30:52

标签: python pandas

我有以下数据框:

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和单个过滤器方法来实现?

1 个答案:

答案 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.transformmean一起使用,返回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