如何通过以前的过滤器正确使用grooupby

时间:2019-05-17 07:16:31

标签: python pandas

我有一个看起来像这样的数据框

       Seats  Saw_Flop WTSD WMSD WWSF
0  _M3M3N7O_         0   No   No   No
1   aladin03         0   No   No  Yes
2   aladin03         1   No   No  Yes
3   aladin03         0   No   No   No
4   aladin03         0   No   No   No
5   aladin03         0   No   No   No
6   aladin03         1   No   No   No
7  kingbel81         0   No   No   No
8  kingbel81         1   No   No   No
9  kingbel81         1   No   No  Yes

我想做的是分组席位,并计算在WMSD,WWSF和WTSD列中出现“是”时,但仅对Saw_Flop == 1的行进行计算。 我所做的是:

dfWTSD = df2[df2['Saw_Flop'] == 1].groupby('Seats').WTSD.value_counts().groupby(level=0).apply(lambda x: x/x.sum()*100).loc(axis=0)[slice(None), 'Yes'].reset_index(drop=True, level=1).reset_index(name = 'WTSD%')
dfWWSF = df2[df2['Saw_Flop'] == 1].groupby('Seats').WWSF.value_counts().groupby(level=0).apply(lambda x: x/x.sum()*100).loc(axis=0)[slice(None), 'Yes'].reset_index(drop=True, level=1).reset_index(name = 'WWSF%')
dfWMSD = df2[df2['Saw_Flop'] == 1].groupby('Seats').WMSD.value_counts().groupby(level=0).apply(lambda x: x/x.sum()*100).loc(axis=0)[slice(None), 'Yes'].reset_index(drop=True, level=1).reset_index(name = 'WMSD%')

因此,首先我过滤了Saw_Flop == 1的数据,然后进行分组以计算出现的Yes的百分比。 我不知道我的逻辑是否正确,因为我收到的平均百分比为20,但应该在40-45之间。

您能告诉我我的计算方法是否正确并显示另一种分组方法吗?

1 个答案:

答案 0 :(得分:2)

如果仅需要来自已过滤行的百分比,那么您的解决方案就可以很好地工作。

您可以通过比较valeus和mask并获得mean来简化它:

mask = df2['Saw_Flop'] == 1
cols = ['WTSD','WMSD','WWSF']
df = df2.loc[mask, cols].eq('Yes').groupby(df2['Seats']).mean().mul(100).add_suffix('%')
print (df)
           WTSD%  WMSD%  WWSF%
Seats                         
aladin03     0.0    0.0   50.0
kingbel81    0.0    0.0   50.0

详细信息

print (df2.loc[mask, cols].eq('Yes'))
    WTSD   WMSD   WWSF
2  False  False   True
6  False  False  False
8  False  False  False
9  False  False   True

但是如果需要计算所有列值中有多少个过滤后的值:

m1 = df2['Saw_Flop'] == 1
cols = ['WTSD','WMSD','WWSF']
m2 = df2[cols] == 'Yes'

mask = m2.mul(m1, axis=0)
df = mask.groupby(df2['Seats']).mean().mul(100).add_suffix('%')
print (df)
           WTSD%  WMSD%      WWSF%
Seats                             
_M3M3N7O_    0.0    0.0   0.000000
aladin03     0.0    0.0  16.666667
kingbel81    0.0    0.0  33.333333

详细信息

print (mask)
    WTSD   WMSD   WWSF
0  False  False  False
1  False  False  False
2  False  False   True
3  False  False  False
4  False  False  False
5  False  False  False
6  False  False  False
7  False  False  False
8  False  False  False
9  False  False   True