我有一个看起来像这样的数据框
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之间。
您能告诉我我的计算方法是否正确并显示另一种分组方法吗?
答案 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