合并Pandas DataFrame并为重复匹配项生成列表
解决方法:分组聚合+左连接实现列表合并
我来帮你搞定这个问题,不用手动遍历或者复杂操作,用pandas内置的分组聚合就能高效实现需求,而且完美适配大体积的df2:
步骤分解
- 第一步:先对df2按
A列分组,把每个分组对应的C列值聚合为列表。这一步只处理C列,完全符合你“仅提取C列”的要求,而且分组聚合是pandas的高效操作,比遍历快得多。 - 第二步:把聚合后的结果和df1做左连接,这样就能自动匹配对应行,没有匹配的行
C列会自动填充为NaN,正好是你想要的目标格式。
完整代码示例
import pandas as pd # 初始化你的两个DataFrame df1 = pd.DataFrame([['ida', 1], ['idb', 2], ['idc', 3]], columns=['A','B']) df2 = pd.DataFrame([['idb', 20], ['ida', 10], ['idb', 21], ['idb', 22]], columns=['A', 'C']) # 对df2分组聚合,将C列转为列表 df2_grouped = df2.groupby('A')['C'].agg(list).reset_index(name='C') # 和df1左连接得到目标df3 df3 = df1.merge(df2_grouped, on='A', how='left') print(df3)
运行后输出的df3就是你要的结果:
A B C 0 ida 1 [10] 1 idb 2 [20, 21, 22] 2 idc 3 NaN
后续统计扩展(均值、标准差)
既然你后续需要计算列表的均值、标准差,这里也给你补充一个便捷方法,不用额外处理:
# 计算均值和标准差,空值保持为None df3['C_mean'] = df3['C'].apply(lambda x: pd.Series(x).mean() if pd.notna(x) else None) df3['C_std'] = df3['C'].apply(lambda x: pd.Series(x).std() if pd.notna(x) else None)
这样df3就会新增C_mean和C_std列,直接得到统计结果。
内容的提问来源于stack exchange,提问作者evilolive
相关产品推荐
相关产品推荐

