基于两列比对为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 | 红富士 |
| 香蕉 | 3 | NaN |
| 橙子 | 4 | 赣南橙 |
| 葡萄 | 6 | NaN |
可选:处理未匹配的情况
如果不想让未匹配的行显示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
相关产品推荐
相关产品推荐

