如何遍历pandas DataFrame 基于另一表匹配值填充缺失值
问题背景
需要基于Route字段的匹配关系,用全量有效DataFrame df 中的Fares值,填充子集DataFrame df1 中Fares列的NaN缺失值,两个表结构如下:
全量表df:
| Sr. No | Fares | Route |
|---|---|---|
| 1 | 123 | ABE-PGD-ABE |
| 2 | 456 | ABQ-SLC-ABQ |
| 3 | 789 | ALB-SJU-ALB |
待填充表df1:
| Sr. No | Fares | Route |
|---|---|---|
| 130 | NaN | ABE-PGD-ABE |
| 297 | NaN | ABQ-SLC-ABQ |
| 345 | NaN | ALB-SJU-ALB |
原代码错误点
- 循环逻辑无效:
for i in df_1直接遍历DataFrame对象时,只会返回列名,无法实现逐行匹配的效果 - 列名引用错误:代码中
df[Fare]未给列名加引号,pandas会将Fare识别为未定义变量抛出报错,且实际列名为Fares,和代码中写的Fare不匹配 - 映射逻辑完全偏离需求:
map({'Nan': ''})的作用是将值等于字符串'Nan'的内容替换为空字符串,既没有匹配pandas真实的空值类型np.nan,也没有关联Route字段做跨表值匹配,完全无法实现填充目标 - 操作对象错误:需求是填充
df1中的Fares空值,原代码反而在修改df的列,操作方向完全错误
正确实现方案
不需要写显式for循环,pandas内置的映射、填充函数可以直接实现需求,执行效率更高。
方法1:映射字典填充(推荐)
先提取df中Route和Fares的对应关系为字典,再基于Route列做映射,用映射结果填充空值即可:
# 构造Route到Fares值的映射字典 fare_map = df.set_index('Route')['Fares'].to_dict() # 匹配映射值填充空值 df1['Fares'] = df1['Fares'].fillna(df1['Route'].map(fare_map))
由于df1是df的子集,所有Route值都能在df中找到对应Fares值,执行后df1的Fares列空值会全部填充完成。
方法2:表合并回填
如果更习惯用表关联的逻辑,也可以通过左连接把df的Fares值关联到df1后回填,效果完全一致:
# 关联匹配到参考Fares值 df1 = df1.merge( df[['Route', 'Fares']], on='Route', how='left', suffixes=('', '_ref') ) # 用参考值填充空值后删除临时列 df1['Fares'] = df1['Fares'].fillna(df1['Fares_ref']) df1 = df1.drop(columns='Fares_ref')
内容的提问来源于stack exchange,提问作者notadoctor
相关产品推荐
相关产品推荐

