[英]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.