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
相关产品推荐
相关产品推荐

