Python pandas:匹配两个DataFrame序列号,将df2匹配行存入df1新列
实现按序列号关联两表并在df1生成嵌套匹配数据列
核心实现思路:先对df2按serialNumbers分组,将每个序列号对应的所有匹配行整理为要求格式的键值对字符串列表,再通过左关联把结果合并到df1中,全程不会造成df1的行数膨胀。
完整运行代码
import pandas as pd # 构造示例数据 data1 = { 'serialNumbers': [1, 2, 3, 4, 5], 'product': ['a', 'b', 'c', 'd', 'e'] } data2 = { 'reviewScore': [5, 1, 4, 1, 5, 2, 4, 3, 1, 3, 4], 'serialNumbers': [1, 1, 1, 1, 3, 4, 4, 2, 3, 3, 4], 'otherData': ['a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd', 'e', 'a'] } df1 = pd.DataFrame(data1) df2 = pd.DataFrame(data2) # 1. 对df2按序列号分组,生成匹配数据列表 grouped_review = df2.groupby('serialNumbers').apply( lambda g: [f"{row.reviewScore} : {row.otherData}" for row in g.itertuples()], include_groups=False ).reset_index(name='reviewData') # 2. 左关联到df1,空匹配填充空列表 df1 = df1.merge( grouped_review, on='serialNumbers', how='left' ).fillna({'reviewData': []}) print(df1)
关键逻辑说明
- 分组处理阶段:逐行遍历df2中同一序列号下的所有记录,按照
评分 : 其他字段值的格式拼接字符串,收集为对应序列号的关联数据列表,和预期输出格式完全对齐 - 关联阶段:以df1为基准做左连接,完全保留df1的原有行、原有字段顺序,不会因为多匹配的评分记录造成df1行数膨胀
- 空值兜底:针对没有任何匹配评分的序列号(示例中为序列号5),自动填充为空列表,避免出现空值异常
运行后输出效果
serialNumbers product reviewData 0 1 a [5 : a, 1 : b, 4 : c, 1 : d] 1 2 b [3 : c] 2 3 c [5 : e, 1 : d, 3 : e] 3 4 d [2 : a, 4 : b, 4 : a] 4 5 e []
注意:分组时添加
include_groups=False参数是为了避免pandas 2.0+版本的分组警告,不需要调整默认分组行为。
内容的提问来源于stack exchange,提问作者David Pinchen
相关产品推荐
相关产品推荐

