这是我想要做的以下输入:
pd.DataFrame({'cat':['A','B','C','B','C','D','C','E'], 'value':[3,6,7,7,9,8,3,1]})
cat value
A 3
B 6
C 7
B 7
C 9
D 8
C 3
E 1
按cat
分组并按降序排序:
df.groupby('cat').sum().sort_values('value', ascending=False)
cat sum
C 19
B 13
D 8
A 3
E 1
保留累计累计小于90%的行,但其余行合并为一个新类别“其他”:
cat sum
C 19
B 13
Other 12
我如何做最后一步?
答案 0 :(得分:3)
让
result = df.groupby('cat').sum().sort_values('value', ascending=False)
将result
除以总和以获得百分比:
In [139]: result.div(result.sum())
Out[139]:
value
cat
C 0.431818
B 0.295455
D 0.181818
A 0.068182
E 0.022727
取累积金额:
In [140]: result.div(result.sum()).cumsum()
Out[140]:
value
cat
C 0.431818
B 0.727273
D 0.909091
A 0.977273
E 1.000000
并构建一个布尔掩码,该掩码是真的,其中cumsum是< 0.9:
In [141]: result.div(result.sum()).cumsum() < 0.9
Out[141]:
value
cat
C True
B True
D False
A False
E False
选择并汇总非遮罩行:
row = result.loc[~mask].sum()
row.name = 'Other'
使用result.loc[mask]
选择True行,并附加“Other”行:
result = result.loc[mask]
result = result.append(row)
import pandas as pd
df = pd.DataFrame({'cat':['A','B','C','B','C','D','C','E'], 'value':[3,6,7,7,9,8,3,1]})
result = df.groupby('cat').sum().sort_values('value', ascending=False)
mask = (result['value'].div(result['value'].sum()).cumsum() < 0.9)
result = result.loc[mask].append(pd.Series(result.loc[~mask].sum(), name='Other'))
print(result)
产量
value
cat
C 19
B 13
Other 12