如何基于df1的列名与项映射为pandas的df2添加Result列?
根据df1映射关系为df2添加Result列
原始数据
先看一下你给出的两个DataFrame:
import pandas as pd # Column列存储列名 df1 = pd.DataFrame({"Column": pd.Series(['a', 'b', 'b', 'c']), "Item": pd.Series(['x', 'y', 'z', 'x']), "Result": pd.Series([3, 4, 5, 6])}) df2 = pd.DataFrame({"a": pd.Series(['x', 'n', 'n']), "b": pd.Series(['x', 'y', 'n']), "c": pd.Series(['x', 'z', 'n'])})
需求解析
你的核心需求是:借助df1里Column与Item的对应关系,给df2新增Result列。具体规则可以拆解为:
- 对df2的每一行,找到其中不为
'n'的列名,匹配df1中Column=该列名且Item=单元格对应值的记录,取出对应的Result; - 如果一行存在多个符合条件的项(比如第二行的
b=y和c=z),取第一个匹配到的Result值; - 如果一行全是
'n',则Result返回None(即你说的null)。
解决方案
我们可以先把df1转换成一个高效的映射字典,再逐行处理df2:
# 第一步:创建(列名, 项目值)到Result的映射字典,方便快速查找 result_mapping = df1.set_index(['Column', 'Item'])['Result'].to_dict() # 第二步:定义处理单行的函数 def get_row_result(row): # 遍历当前行的每一列和对应值 for col_name, item_val in row.items(): if item_val != 'n': # 从映射字典取结果,找不到则返回None return result_mapping.get((col_name, item_val), None) # 所有值都是'n'的情况,返回None return None # 第三步:将函数应用到df2的每一行,生成Result列 df2['Result'] = df2.apply(get_row_result, axis=1)
最终结果
运行代码后,df2会变成你期望的样子:
a b c Result 0 x x x 3 1 n y z 4 2 n n n None
这个方案逻辑清晰,映射字典的查找效率也很高,完美匹配你的需求~
内容的提问来源于stack exchange,提问作者reservoirinvest
相关产品推荐
相关产品推荐

