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

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'])

代码解释

  1. df.set_index('A')['B']:将A列设为索引,B列为对应值,生成一个可用于映射的Series,本质是构建了A到B的键值对映射
  2. df['C'].map(...):遍历C列的每个值,去上述映射中查找对应值,匹配不到则返回NaN
  3. .fillna(df['B']):将所有NaN替换为当前行的B列值,完美贴合需求逻辑

这个方案代码更紧凑,避免了临时DataFrame的创建和合并操作,执行效率也更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:35:22