Pandas:利用列间关联关系填充DataFrame缺失值的需求
基于列间关联填充Pandas DataFrame缺失值
原始DataFrame
| Val1 | Val2 |
|---|---|
| Cambridge | MA |
| NAN | FL |
| Washington | DC |
| Washington | NAN |
| Miami | FL |
| NAN | DC |
| Washington | DC |
| Miami | FL |
目标DataFrame
| Val1 | Val2 |
|---|---|
| Cambridge | MA |
| Miami | FL |
| Washington | DC |
| Washington | DC |
| Miami | FL |
| Washington | DC |
| Washington | DC |
| Miami | FL |
解决方案
核心思路是先建立两列之间的双向唯一映射关系,再用映射填充对应列的缺失值。
代码实现
import pandas as pd # 创建原始DataFrame(用pd.NA表示缺失值) df = pd.DataFrame({ 'Val1': ['Cambridge', pd.NA, 'Washington', 'Washington', 'Miami', pd.NA, 'Washington', 'Miami'], 'Val2': ['MA', 'FL', 'DC', pd.NA, 'FL', 'DC', 'DC', 'FL'] }) # 从无缺失的行中提取双向映射(去重确保每个值对应唯一关联值) val1_to_val2 = df.dropna().drop_duplicates().set_index('Val1')['Val2'].to_dict() val2_to_val1 = df.dropna().drop_duplicates().set_index('Val2')['Val1'].to_dict() # 填充Val1的缺失值:根据Val2的映射值 df['Val1'] = df['Val1'].fillna(df['Val2'].map(val2_to_val1)) # 填充Val2的缺失值:根据Val1的映射值 df['Val2'] = df['Val2'].fillna(df['Val1'].map(val1_to_val2)) # 查看结果 print(df)
代码说明
- 构建映射:通过
dropna()过滤掉有缺失值的行,drop_duplicates()确保每个键只对应一个值(避免一对多的冲突),最后转换为字典得到双向映射关系。 - 填充缺失值:
- 当
Val1缺失时,用Val2的值去val2_to_val1字典中查找对应的Val1值填充; - 当
Val2缺失时,用Val1的值去val1_to_val2字典中查找对应的Val2值填充。
- 当
执行后即可得到目标DataFrame。
内容的提问来源于stack exchange,提问作者Vanessa
相关产品推荐
相关产品推荐

