You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:09:30