如何根据Column A的值匹配对应_Input列设置DataFrame的Column B值?
解决思路
示例数据
先还原你的示例DataFrame:
import pandas as pd columns = ["Value A_Input", "Value B_Input", "Value C_Input", "Column A", "Column B"] raw_data = [ ["aaa", "ddd", "ggg", "Value A", "aaa"], ["bbb", "eee", "hhh", "Value C", "hhh"], ["ccc", "fff", "iii", "Value B", "fff"], ] df = pd.DataFrame(raw_data, columns=columns)
需求说明
根据Column A的每行值拼接_Input得到目标列名,将该列对应的值赋值给Column B。
你的代码问题
你写的代码存在两个核心问题:
str([x for x in df['Column A']])会把整个Column A的所有值转成一个字符串列表,不是逐行处理单个值,无法匹配每行对应的列。- 语法错误:代码末尾多了一个右括号
),导致运行报错。
正确解法
方法1:用apply逐行处理(简单直观)
df['Column B'] = df.apply(lambda row: row[row['Column A'] + '_Input'], axis=1)
逐行遍历DataFrame,每行中通过row['Column A'] + '_Input'拼接得到目标列名,再取出该列的值赋值给Column B。
方法2:用lookup(性能更优)
如果你的Pandas版本在1.5.0及以上,推荐用lookup方法,它比apply效率更高,专门处理这种按行匹配列的场景:
df['Column B'] = df.lookup(df.index, df['Column A'] + '_Input')
lookup接收行索引数组和列名数组,直接定位到每个单元格的值,批量完成赋值。
方法3:用melt+merge(适合复杂场景)
如果数据量较大或者需要更灵活的关联逻辑,可以先将输入列转成长格式再合并:
# 筛选所有以_Input结尾的列 input_cols = [col for col in df.columns if col.endswith('_Input')] # 将输入列转成长格式 melted_df = df.melt( id_vars=['Column A'], value_vars=input_cols, var_name='Input_Column', value_name='Target_Value' ) # 生成匹配列:去掉_Input后缀,和Column A对应 melted_df['Match_Key'] = melted_df['Input_Column'].str.replace('_Input', '') # 只保留匹配成功的行 matched = melted_df[melted_df['Match_Key'] == melted_df['Column A']] # 合并回原DataFrame并赋值 df['Column B'] = matched['Target_Value'].values
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

