如何在pandas的groupby.agg中为特定分组添加指定值?
问题场景与需求
处理文件后得到如下DataFrame和独立数值val=20.0:
df = pd.DataFrame({ 'A': ['foo', 'foo', 'foo', 'fizz', 'fizz', 'fizz', 'fizz'], 'B': ['bar', 'bar', 'bar', 'buzz', 'buzz', 'buzz', 'baz'], 'C': [10,10,10,10,10,10,10] }) val = 20.0
其中val是从文件中提取并转换为float的数值,提取逻辑如下:
if len(df.loc[df['ID'].eq("Settle"), 'C'].values) > 0: temp = df.loc[df['ID'].eq("Settle"), 'C'] if temp.values[0].isnumeric(): num = float(temp.values[0]) else: num = 0.0 else: num = 0.0
需要按A列分组对C列求和,且当A=='foo'时,需将val加到该组的求和结果中,期望输出:
A C foo 50 fizz 40
解决方案
方法一:先分组求和,再修改目标组
先执行基础分组求和,再定位到A='foo'的行,将C列的值加上val:
import pandas as pd # 初始化数据 df = pd.DataFrame({ 'A': ['foo', 'foo', 'foo', 'fizz', 'fizz', 'fizz', 'fizz'], 'B': ['bar', 'bar', 'bar', 'buzz', 'buzz', 'buzz', 'baz'], 'C': [10,10,10,10,10,10,10] }) val = 20.0 # 基础分组求和 out = df.groupby(['A'], sort=False, as_index=False).agg({"C":"sum"}) # 给foo组的C值加上val out.loc[out['A'] == 'foo', 'C'] += val print(out)
方法二:在agg中直接用lambda处理
通过lambda函数判断分组名称,直接在聚合时完成加值操作:
import pandas as pd # 初始化数据 df = pd.DataFrame({ 'A': ['foo', 'foo', 'foo', 'fizz', 'fizz', 'fizz', 'fizz'], 'B': ['bar', 'bar', 'bar', 'buzz', 'buzz', 'buzz', 'baz'], 'C': [10,10,10,10,10,10,10] }) val = 20.0 # 分组聚合时判断处理 out = df.groupby(['A'], sort=False, as_index=False).agg( C=('C', lambda x: x.sum() + val if x.name == 'foo' else x.sum()) ) print(out)
内容的提问来源于stack exchange,提问作者iBeMeltin
相关产品推荐
相关产品推荐

