Python Pandas实现类Excel SUMIF功能:更优雅高效的替代方法
更优雅高效的实现方法
这里推荐两种简洁高效的方式,避免繁琐的合并操作:
方法1:groupby + map(最简洁直接)
先计算第二个DataFrame中每个名称对应的Z列求和结果,再通过映射直接填充到第一个DataFrame的C列:
import pandas as pd # 初始化示例数据 df1 = pd.DataFrame({'A': [1,2,3], 'B': ['John','Mike','David'], 'C': [None, None, None]}) df2 = pd.DataFrame({'X': [1,2,3,4,5], 'Y': ['Mike','Mike','John','David','David'], 'z': [100,200,300,400,500]}) # 计算每个Y对应的z列总和 name_sum = df2.groupby('Y')['z'].sum() # 映射填充C列 df1['C'] = df1['B'].map(name_sum)
运行后df1就会得到你想要的结果。这种方式无需合并操作,直接通过列值映射完成赋值,代码更简洁,逻辑清晰,且对于大数据集的效率优于合并(避免了合并时的索引对齐开销)。
如果需要处理df1中存在df2没有的名称的情况,可以保留原C列值:
df1['C'] = df1['B'].map(name_sum).fillna(df1['C'])
方法2:transform 配合合并(可选)
如果偏好使用合并逻辑,也可以用transform提前在df2中生成求和列,再做合并(比先分组再合并更紧凑):
# 给df2添加每个Y对应的求和列 df2['sum_z'] = df2.groupby('Y')['z'].transform('sum') # 合并后去重并赋值 df1 = df1.merge(df2[['Y','sum_z']].drop_duplicates(), left_on='B', right_on='Y', how='left').drop('Y', axis=1).rename(columns={'sum_z':'C'})
不过这种方式不如第一种简洁,更适合需要保留df2其他信息的场景。
内容的提问来源于stack exchange,提问作者MDJ
相关产品推荐
相关产品推荐

