gpt4 book ai didi

python - Pandas groupby 得到总和的过滤总和

转载 作者:行者123 更新时间:2023-11-28 21:31:13 25 4
gpt4 key购买 nike

我有以下数据框:

df = pd.DataFrame([[1, 2, True], [1, 4, False], [2, 6, False], [2, 8, True]], columns=["Group", "Value", "C"])

Group Value C
0 1 2 True
1 1 4 False
2 2 6 False
3 2 8 True

而且我希望每个组都知道 C 等于 true 的值的总和超过值的总和。因此,例如对于第 1 组,我们有 2/(2+4)

我已经通过一些广泛的搜索设法达到了以下阶段:

df.groupby('Group').agg(lambda x: x.loc[x.C == True, 'Value'].sum() / x.Value.sum())

Value C
Group
1 0.333333 0.333333
2 0.571429 0.571429

但是(正如预期的那样)我得到了两列,而我只想得到一列。我理想的结果是:

       Ratio        
Group
1 0.333333
2 0.571429

我当然可以在 groupby 之后做一些修改并得到我想要的东西,但由于我是 Python 的新手,我想知道我是否遗漏了一些基本的东西。

最佳答案

您可以除以所有行的聚合筛选行,然后将 Series 转换为一列DataFrame:

filt = df.loc[df['C']].groupby('Group')['Value'].sum()
tot = df.groupby('Group')['Value'].sum()
df1 = filt.div(tot, fill_value=0).to_frame('ratio')
print (df1)
ratio
Group
1 0.333333
2 0.571429

您的解决方案可以通过将所有列的 .agg 更改为 GroupBy.apply 来实现。用于返回 Series,但如果数据量很大/许多独特的组,它应该很慢:

df = (df.groupby('Group')
.apply(lambda x: x.loc[x.C, 'Value'].sum() / x.Value.sum())
.to_frame('ratio'))
print (df)
ratio
Group
1 0.333333
2 0.571429

解决方案也适用于仅 False 组:

df = pd.DataFrame([[0, 2, False], [1, 2, True], [1, 4, False], 
[2, 6, False], [2, 8, True]], columns=["Group", "Value", "C"])


df1 = (df.groupby('Group')
.apply(lambda x: x.loc[x.C, 'Value'].sum() / x.Value.sum())
.to_frame('ratio'))
print (df1)
ratio
Group
0 0.000000
1 0.333333
2 0.571429

filt = df.loc[df['C']].groupby('Group')['Value'].sum()
tot = df.groupby('Group')['Value'].sum()

print (df1)
ratio
Group
0 0.000000
1 0.333333
2 0.571429

关于python - Pandas groupby 得到总和的过滤总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58623653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com