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

基于两列比对为Pandas DataFrame填充新列的技术问询

嘿,这个需求其实用Pandas的merge方法就能轻松搞定,完全不用手动遍历(遍历在数据量大的时候效率极低,能避就避)!我给你一步步拆解实现:

核心思路

我们需要把两个DataFrame按「df1的A列」和「df2的B列」做左连接——这样既能保留df1的所有行,又能把匹配到的df2的C列值对应过来,没匹配到的行自动填充为NaN(你要是想改成其他默认值,后面我也会说怎么弄)。

示例代码

先构造两个测试用的DataFrame方便你理解:

import pandas as pd

# 示例DataFrame 1
df1 = pd.DataFrame({
    'A': ['苹果', '香蕉', '橙子', '葡萄'],
    '单价': [5, 3, 4, 6]
})

# 示例DataFrame 2
df2 = pd.DataFrame({
    'B': ['苹果', '橙子', '芒果'],
    'C': ['红富士', '赣南橙', '青芒'],
    '产地': ['山东', '江西', '海南']
})

接下来是核心操作,一行代码就能搞定匹配和新增列:

# 左连接+重命名列,一步到位
df1 = df1.merge(df2[['B', 'C']], left_on='A', right_on='B', how='left') \
         .drop('B', axis=1) \
         .rename(columns={'C': 'D'})

执行完后,df1的结果会是这样:

A单价D
苹果5红富士
香蕉3NaN
橙子4赣南橙
葡萄6NaN

可选:处理未匹配的情况

如果不想让未匹配的行显示NaN,可以用fillna给个默认值,比如:

df1['D'] = df1['D'].fillna('无对应匹配值')

为啥不推荐遍历?

要是你之前想过用iterrows()或者apply()循环遍历,我得提醒你:这种方法在数据量小的时候凑合用,但数据上万行之后,速度会比merge慢几十甚至上百倍——Pandas的向量化操作(比如merge)是底层优化过的,效率高太多了。当然,如果你非要写遍历的版本(仅作参考):

# 不推荐的遍历写法,仅用于理解逻辑
df1['D'] = None
for idx, row in df1.iterrows():
    match_row = df2[df2['B'] == row['A']]
    if not match_row.empty:
        df1.loc[idx, 'D'] = match_row['C'].values[0]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:13:56