我有一个Dataframe:
User Numbers
A 0
A 4
A 5
B 0
B 0
C 1
C 3
我想对每个相应的分组数据执行操作。例如,如果我要删除Users
0的所有Number
,它应该如下所示:
User Numbers
A 0
A 4
A 5
C 1
C 3
因为Numbers
B的所有User
都是0。
或者例如,如果我想找到所有用户的数字的方差,它应该看起来像:
Users Variance
A 7
B 0
C 2
这意味着只计算A的Numbers
以找出A的方差等等。
是否有一般方法来进行所有这些计算以匹配分组数据?
答案 0 :(得分:1)
您需要两种不同的操作 - filtration per groups和aggregation per groups。
<强>过滤强>:
为了获得更好的性能,最好使用transform
进行布尔掩码,并按boolean indexing
进行过滤。
df1 = df[~df['Number'].eq(0).groupby(df['User']).transform('all')]
print (df1)
User Number
0 A 0
1 A 4
2 A 5
5 C 1
6 C 3
步骤:
1.首先通过eq
比较Number
来创建布尔系列:
print (df['Number'].eq(0))
0 True
1 False
2 False
3 True
4 True
5 False
6 False
Name: Number, dtype: bool
2.然后使用另一列syntactic sugar - groupby
和transform
函数all
来检查每个组True
是否transform
和DataFrame
}用于与原始print (df['Number'].eq(0).groupby(df['User']).transform('all'))
0 False
1 False
2 False
3 True
4 True
5 False
6 False
Name: Number, dtype: bool
大小相同的掩码:
~
3.按print (~df['Number'].eq(0).groupby(df['User']).transform('all'))
0 True
1 True
2 True
3 False
4 False
5 True
6 True
Name: Number, dtype: bool
:
print (df[~df['Number'].eq(0).groupby(df['User']).transform('all')])
User Number
0 A 0
1 A 4
2 A 5
5 C 1
6 C 3
4.Filter:
df2 = df.groupby('User').filter(lambda x: ~x['Number'].eq(0).all())
print (df2)
User Number
0 A 0
1 A 4
2 A 5
5 C 1
6 C 3
使用filter的大型DataFrame中的另一个更慢的解决方案,与第一个解决方案的逻辑相同:
df3 = df.groupby('User', as_index=False)['Number'].var()
print (df3)
User Number
0 A 7
1 B 0
2 C 2
<强>聚合强>:
对于具有一个聚合函数的一列的简化聚合,例如GroupBy.var
使用:
{{1}}