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

如何合并两个Pandas DataFrame得到列表类型新列或展开的结果表?

实现方案

结果1:SocMed为列表格式

先对df2按User分组聚合得到每个用户的社交媒体列表,再和df1左连接即可,代码如下:

import pandas as pd

# 修复示例df1的语法错误(原数据中第二个user1后缺逗号)
df1 = pd.DataFrame({'User': ['user1', 'user1', 'user2', 'user3'],
                    'Grade': ['XLM', 'YK', 'AAO', 'FRT']})
df2 = pd.DataFrame({'User': ['user1', 'user1', 'user1', 'user2', 'user2', 'user3'],
                    'SocMed': ['Instagram', 'FB', 'Twitter', 'Quora', 'Pinterest', 'Snapchat']})

# 聚合df2的SocMed为列表格式
df2_agg = df2.groupby('User')['SocMed'].agg(list).reset_index()

# 左连接得到结果,无匹配的用户自动填充为空列表
merged_list = pd.merge(df1, df2_agg, on='User', how='left')
merged_list['SocMed'] = merged_list['SocMed'].apply(lambda x: x if isinstance(x, list) else [])

该方案性能极高,df2仅600行聚合开销极小,左连接100万行的df1无任何压力。


结果2:展开的长表格式

直接使用左连接即可,df1的每一行会自动匹配df2中同用户的所有行,直接生成长表:

merged_long = pd.merge(df1, df2, on='User', how='left')
# 如需把无匹配的SocMed填充为空值,可补充下行代码:merged_long['SocMed'] = merged_long['SocMed'].fillna('')

保留how='left'参数即可保留所有df1的行,符合你允许部分条目SocMed为空的需求。

内容的提问来源于stack exchange,提问作者NPD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:39:02