繁体   English   中英

根据总百分比选择 pandas dataframe 中的组

[英]Selecting groups in pandas dataframe based on percentage of total

col_a   col_b
a        10
a        20
c        10
c        5
d        20
e        30

col_b的总数为 95。我只想 select 那些col_b值的总和超过总数的 80%(95)的行。 在这种情况下,每组的总和是

a 30
c 15
d 20
e 30

在这种情况下,我们从最大的开始并继续包含col_a行,直到超过 95 的 80& 即超过 76。 因此最终结果将是:

col_a   col_b
a        10
a        20
d        20
e        30

即我们将在col_a中排除对应于c的行。 如何使用 Pandas 实现这一目标?

一种方法是:

(
    df
        .set_index('col_a')[
            df
                .groupby('col_a')
                .sum()
                .sort_values(by='col_b', ascending=False)
                .cumsum()
                .lt(df.col_b.sum()*0.8)
                .shift(fill_value=True)
        ]
        .dropna()
        .reset_index()
)

或在一长行中相同:

df.set_index('col_a')[df.groupby('col_a').sum().sort_values(by='col_b', ascending=False).cumsum().lt(df.col_b.sum()*0.8).shift(fill_value=True)].dropna().reset_index()

Output:

  col_a  col_b
0     a   10.0
1     a   20.0
2     d   20.0
3     e   30.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM