Pandas如何实现DataFrame与单行向量逐行配对合并
Pandas 两DataFrame按列匹配生成列表/字典单元格实现方案
首先准备测试数据,需提前导入pandas和numpy依赖:
import pandas as pd import numpy as np df1 = pd.DataFrame({"A":[1,0,1,2,1],"B":[2,2,1,0,1],"C":[1,1,1,2,1],"D":[2,1,2,1,1]}) df2 = pd.DataFrame({"A":[1],"B":[2],"D":[4]})
核心预处理步骤:由于df2仅1行数据,先提取其第一行的列取值,对齐df1的全部列,df2中不存在的列自动填充np.nan:
weight_series = df2.iloc[0].reindex(df1.columns)
实现二元列表格式结果
逐列遍历,将df1列中每个值和对应列的匹配值打包为长度为2的列表即可:
res_list = pd.DataFrame() for col in df1.columns: col_weight = weight_series[col] res_list[col] = df1[col].apply(lambda val: [val, col_weight])
执行后输出结果完全匹配预期:
A B C D 0 [1, 1] [2, 2] [1, nan] [2, 4] 1 [0, 1] [2, 2] [1, nan] [1, 4] 2 [1, 1] [1, 2] [1, nan] [2, 4] 3 [2, 1] [0, 2] [2, nan] [1, 4] 4 [1, 1] [1, 2] [1, nan] [1, 4]
实现字典格式结果(优选方案)
逻辑和列表格式一致,仅需将打包的二元结构替换为固定键的字典,Answer键存df1原值,Weight键存df2对应列的匹配值:
res_dict = pd.DataFrame() for col in df1.columns: col_weight = weight_series[col] res_dict[col] = df1[col].apply(lambda val: {"Answer": val, "Weight": col_weight})
执行后输出结果完全匹配预期:
A B C D 0 {'Answer': 1, 'Weight': 1} {'Answer': 2, 'Weight': 2} {'Answer': 1, 'Weight': nan} {'Answer': 2, 'Weight': 4} 1 {'Answer': 0, 'Weight': 1} {'Answer': 2, 'Weight': 2} {'Answer': 1, 'Weight': nan} {'Answer': 1, 'Weight': 4} 2 {'Answer': 1, 'Weight': 1} {'Answer': 1, 'Weight': 2} {'Answer': 1, 'Weight': nan} {'Answer': 2, 'Weight': 4} 3 {'Answer': 2, 'Weight': 1} {'Answer': 0, 'Weight': 2} {'Answer': 2, 'Weight': nan} {'Answer': 1, 'Weight': 4} 4 {'Answer': 1, 'Weight': 1} {'Answer': 1, 'Weight': 2} {'Answer': 1, 'Weight': nan} {'Answer': 1, 'Weight': 4}
注:如果后续df2存在多行需要按行索引配对,仅需调整
weight_series的生成逻辑为按行广播即可,当前单值匹配场景下上述写法执行效率最高,无需使用复杂的merge或张量广播操作。
内容的提问来源于stack exchange,提问作者Luiz Adauto Sanches Ribeiro
相关产品推荐
相关产品推荐

