Pandas DataFrame优化查询:基于列C匹配列A获取列B值
更简洁的Pandas实现:按列值匹配映射新增列
问题说明
原始DataFrame:
A B C 0 zeroA zeroB zeroC 1 oneA oneB zeroA 2 twoA twoB twoC
需要新增列BB,规则如下:
- 对每行,用
C列的字符串在A列中查找匹配项 - 匹配成功:返回匹配行的
B列值 - 匹配失败:返回当前行的
B列值
最终期望结果:
A B C BB 0 zeroA zeroB zeroC zeroB 1 oneA oneB zeroA zeroB 2 twoA twoB twoC twoB
用户现有实现(基于临时DataFrame合并填充):
import pandas as pd data = {'A': ['zeroA', 'oneA', 'twoA'], 'B': ['zeroB', 'oneB', 'twoB'], 'C': ['zeroC', 'zeroA', 'twoC']} df = pd.DataFrame(data) # 步骤1:创建临时DataFrame并重命名列 tmp_df = df[['A', 'B']].rename({'A':'C', 'B':'BB'}, axis=1) # 步骤2:左合并DataFrame df = pd.merge(df, tmp_df, how='left', on='C') # 步骤3:填充空值 df.loc[df['BB'].isnull(), ['BB']] = df['B']
优化后的简洁方案
无需创建临时DataFrame,利用Pandas的map结合fillna即可一步完成:
import pandas as pd data = {'A': ['zeroA', 'oneA', 'twoA'], 'B': ['zeroB', 'oneB', 'twoB'], 'C': ['zeroC', 'zeroA', 'twoC']} df = pd.DataFrame(data) # 构建A→B的映射,用C列匹配映射,空值填充为当前行B列值 df['BB'] = df['C'].map(df.set_index('A')['B']).fillna(df['B'])
代码解释
df.set_index('A')['B']:将A列设为索引,B列为对应值,生成一个可用于映射的Series,本质是构建了A到B的键值对映射df['C'].map(...):遍历C列的每个值,去上述映射中查找对应值,匹配不到则返回NaN.fillna(df['B']):将所有NaN替换为当前行的B列值,完美贴合需求逻辑
这个方案代码更紧凑,避免了临时DataFrame的创建和合并操作,执行效率也更高。
内容的提问来源于stack exchange,提问作者orlowand
相关产品推荐
相关产品推荐

