Python中按条件匹配其他行值生成新列f的实现问题
解决方案
核心思路是先建立d列值到对应b列值的映射表(仅保留d与e相等的行,这些行的b值就是对应d值的目标结果),再用e列的值匹配该映射表,即可直接生成f列。这种方式比逐行apply效率更高,代码更简洁。
具体步骤
提取所有
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}用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
相关产品推荐
相关产品推荐

