python - Pandas 条件聚合和非条件聚合在一起
问题描述
我是一个重度 SQL 用户,而且我是 Python 和 Pandas 的新手。我有一个数据框。
import pandas as pd
data=[[1,100,'a'],[1,200,'b'],[2,300,'a'],[2,400,'a'],[3,500,'b'],[3,600,'a'],[3,700,'b']]
df=pd.DataFrame(data,columns=['Group','Amount','Condition'])
我可以一步计算条件总和和“常规”总和吗?
基本上,在 SQL 中,它会是这样的。
select [Group]
,sum([Amount]) as Amount
,sum(case when [Condition]=’a’ then [Amount] end) as Conditional_Sum
from df
group by [Group]
但在 Pandas 中,我将它们分为几个步骤。
对于“常规”总和,我使用
df1=df.groupby('Group')['Amount'].sum().reset_index()
对于条件总和,我使用
df2=df.groupby('Group').apply(lambda x: x[x['Condition']=='a']['Amount'].sum()).to_frame(name='Conditional_Sum')
df2.reset_index(inplace=True)
然后我合并 df1 和 df2。我可以一步完成吗?
编辑:澄清一下,有没有办法在一步内创建下面的数据框?
Group Amount Conditional_Sum
0 1 300 100
1 2 700 700
2 3 1800 600
解决方案
您可以使用 groupby 应用并创建带有某些列的系列
df.groupby('Group', as_index=False) \
.apply(lambda x: pd.Series( \
{'totalsum' : x['Amount'].sum(), \
'condsum': x.loc[x['Condition']=='a','Amount'].sum()}))
totalsum condsum
0 300 100
1 700 700
2 1800 600
推荐阅读
- mysql - Rust:我可以在不准备语句的情况下执行 MySQL 查询吗
- rebol - 在 Red/Rebol 中调用此函数时如何评估函数的细化
- perl - 如何消除有关 while 循环增量的错误
- c# - 在 c# 中解析 JSON 后日期时间格式更改
- javascript - 我的主页总是呈现在所有其他页面之上,就像我在登录时一样,我的主页数据首先呈现为单页中的 2 页
- mockito - 我无法使用 mockito 替换 SpringBatch 中的方法调用
- c# - 将值从一行添加到另一行后如何清除列值
- javascript - 在 ReactJS 中提交表单后没有获取任何数据
- sql - 展平和重构 JSON 雪花
- hystrix - Resilience4j 与 Sentinel