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

Python中如何基于DataFrame另一列的映射关系填充NA空值

解决方案

核心思路

先基于数据中两列都非空的有效行,生成双向映射字典,再分别对单列缺失的行做填充,自动保留两列同时缺失的行不修改。

完整代码实现

import pandas as pd
import numpy as np

# 1. 构造示例DataFrame(你可以替换成自己的实际数据)
df = pd.DataFrame({
    'Name': ['AB', 'QR', np.nan, 'AB', np.nan, np.nan],
    'Class': [np.nan, np.nan, 'Sixth', 'Sixth', 'First', np.nan]
})

# 2. 生成双向映射规则
# 如果你已经提前知道固定对应关系,可以直接手动构造这两个字典,不需要从数据提取
valid_pairs = df.dropna(subset=['Name', 'Class']).drop_duplicates(['Name', 'Class'])
name_to_class = dict(zip(valid_pairs['Name'], valid_pairs['Class']))
class_to_name = dict(zip(valid_pairs['Class'], valid_pairs['Name']))

# 3. 填充缺失值
# 填充Class列:仅Name非空、Class为空时触发映射
df['Class'] = df.apply(
    lambda row: name_to_class.get(row['Name'], row['Class']) 
    if pd.isna(row['Class']) and pd.notna(row['Name']) 
    else row['Class'],
    axis=1
)
# 填充Name列:仅Class非空、Name为空时触发映射
df['Name'] = df.apply(
    lambda row: class_to_name.get(row['Class'], row['Name']) 
    if pd.isna(row['Name']) and pd.notna(row['Class']) 
    else row['Name'],
    axis=1
)

# 查看结果
print(df)

运行结果说明

示例数据运行后输出如下:

Name  Class
0   AB  Sixth
1   QR  First
2   AB  Sixth
3   AB  Sixth
4   QR  First
5  NaN    NaN

可以看到最后一行两列同时为空的记录被保留,其余单列缺失的记录都按照对应关系完成了填充。

注意事项

  • 如果业务中的固定对应关系是预先明确的,直接手动定义name_to_class和class_to_name即可,不需要从现有数据中提取,避免脏数据导致映射错误
  • 如果现有数据中存在同一Name对应多个Class的冲突情况,可以对valid_pairs先按出现频率排序,取出现次数最多的配对作为映射规则
  • 两列同时为空的记录不会被修改,可以后续按业务需求用众数或其他规则二次填充

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 00:00:03