对相应的匹配分组Pandas数据帧执行操作

时间:2018-04-25 06:00:46

标签: python pandas

我有一个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的方差等等。

是否有一般方法来进行所有这些计算以匹配分组数据?

1 个答案:

答案 0 :(得分:1)

您需要两种不同的操作 - filtration per groupsaggregation 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 - groupbytransform函数all来检查每个组True是否transformDataFrame }用于与原始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}}