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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:55:32