pandas:如何将groupby行的子集聚合成一行?

时间:2016-03-17 21:44:01

标签: python pandas

这是我想要做的以下输入:

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
  1. cat分组并按降序排序:

    df.groupby('cat').sum().sort_values('value', ascending=False)
    
    cat    sum
    C       19
    B       13
    D        8
    A        3
    E        1
    
  2. 保留累计累计小于90%的行,但其余行合并为一个新类别“其他”:

    cat    sum
    C       19
    B       13
    Other   12
    
  3. 我如何做最后一步?

1 个答案:

答案 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