如何为Pandas的df2添加列,值为df1对应Type的data求和结果
问题描述
现有两个Pandas DataFrame(注意:原代码中的A/B/C需要加引号,否则会触发变量未定义错误):
import pandas as pd df1 = pd.DataFrame({"Type": ["A", "A", "B", "B", "C"], "data": [1,2,3,4,5]}) # df1的输出结构: # Type data # 0 A 1 # 1 A 2 # 2 B 3 # 3 B 4 # 4 C 5 df2 = pd.DataFrame({"Type": ["A", "B", "C"]}) # df2的输出结构: # Type # 0 A # 1 B # 2 C
想要给df2新增一列Value,该列每个单元格的值为df1中相同Type对应的所有data值的总和,期望最终输出如下:
Type Value 0 A 3 1 B 7 2 C 5
不想用循环遍历df2的Type值来求和,请问用规范的Pandas操作该怎么实现?
解决方案
方法1:分组求和后合并(最直观)
先对df1按Type分组计算总和,再和df2做左连接即可:
# 计算每个Type对应的data总和,并重命名列 sum_df = df1.groupby("Type")["data"].sum().reset_index(name="Value") # 将求和结果合并到df2中 df2 = df2.merge(sum_df, on="Type", how="left")
这种方式逻辑清晰,完全采用Pandas的向量式操作,比循环高效数倍,新手也容易理解。
方法2:用map快速映射
如果想要更简洁的代码,直接用map结合分组求和的结果构建映射:
# 先创建Type到对应总和的映射关系 type_sum_map = df1.groupby("Type")["data"].sum() # 给df2新增Value列 df2["Value"] = df2["Type"].map(type_sum_map)
这个方法代码量少,执行效率也很高,适合快速处理这类一对一的映射需求。
方法3:transform+去重合并(适合需保留原df1结构的场景)
如果你的业务场景需要先给df1的每一行都添加上对应Type的总和,再和df2合并,可以用这个方法:
# 给df1的每一行添加上对应Type的data总和 df1["Value"] = df1.groupby("Type")["data"].transform("sum") # 去重后合并到df2 df2 = df2.merge(df1[["Type", "Value"]].drop_duplicates(), on="Type", how="left")
不过针对当前需求,前两种方法更直接高效。
内容的提问来源于stack exchange,提问作者Sebastián P. Pincheira
相关产品推荐
相关产品推荐

