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

Python中按条件匹配其他行值生成新列f的实现问题

解决方案

核心思路是先建立d列值到对应b列值的映射表(仅保留d与e相等的行,这些行的b值就是对应d值的目标结果),再用e列的值匹配该映射表,即可直接生成f列。这种方式比逐行apply效率更高,代码更简洁。

具体步骤

  1. 提取所有d == e的行,构建d到b的映射字典:

    # 筛选d和e相等的行,提取d和b列转为字典
    d_to_b = df.loc[df['d'] == df['e'], ['d', 'b']].set_index('d')['b'].to_dict()
    

    示例中这一步会得到字典:{13: 3, 16: 6}

  2. 用e列的值匹配映射字典,生成f列:

    df['f'] = df['e'].map(d_to_b)
    

完整代码示例

import pandas as pd

# 示例数据
data = {
    'a': [None, None, None, None, None, None],
    'b': [1, 2, 3, 4, 5, 6],
    'c': [None, None, None, None, None, None],
    'd': [11, 12, 13, 14, 15, 16],
    'e': [13, 13, 13, 16, 16, 16]
}
df = pd.DataFrame(data)

# 构建映射字典
d_to_b = df.loc[df['d'] == df['e'], ['d', 'b']].set_index('d')['b'].to_dict()

# 生成f列
df['f'] = df['e'].map(d_to_b)

print(df)

运行后输出结果与示例表格完全一致:

a  b     c   d   e  f
0  NaN  1  NaN  11  13  3
1  NaN  2  NaN  12  13  3
2  NaN  3  NaN  13  13  3
3  NaN  4  NaN  14  16  6
4  NaN  5  NaN  15  16  6
5  NaN  6  NaN  16  16  6

原尝试代码的问题分析

你写的df.apply(df['b'] if df['d'] == df['e'] else df[df['d'] == df['e'],'b'].values)存在以下问题:

  • df['d'] == df['e']是对整个列的比较,返回布尔Series,不符合apply逐行处理的逻辑,会直接报错。
  • 索引语法错误:df[df['d'] == df['e'],'b']应改为df.loc[df['d'] == df['e'], 'b']。
  • 即便修正语法,df.loc[df['d'] == df['e'], 'b'].values是一个数组,无法直接匹配当前行的e值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:00:14