如何基于Subid分组,用另一DataFrame填充df1中的NaN值?
按Subid分组用指定值填充DataFrame的NaN值
问题背景
现有包含Id、Subid及多特征列的DataFrame df1,特征列存在NaN值:
import pandas as pd import numpy as np df1 = pd.DataFrame({'Id': ['A1', 'A2', 'A3', 'B1', 'B2'], 'Subid':['A', 'A', 'A', 'B', 'B'], 'feature1':[2.6, 6.3, np.nan, np.nan, 3.3], 'feature2':[55, np.nan, np.nan, 44, 69], 'feature3':[np.nan, 0.5, 0.3, np.nan, np.nan], 'feature4':[22, np.nan, 46, np.nan, 33], 'feature5':[np.nan, np.nan, 52, np.nan, 53] })
另有DataFrame df2,存储各Subid对应的特征填充值:
df2 = pd.DataFrame({'Subid': ['A', 'B'], 'feature1': [2.966666666666667, 1.65], 'feature2': [18.333333333333332, 56.5], 'feature3': [0.26666666666666666, 0.0], 'feature4': [22.666666666666668, 16.5], 'feature5': [17.333333333333332, 26.5]})
需要按Subid分组,用df2中对应Subid的特征值填充df1中的NaN,最终得到如下输出:
outputdf = pd.DataFrame({'Id': ['A1', 'A2', 'A3', 'B1', 'B2'], 'Subid':['A', 'A', 'A', 'B', 'B'], 'feature1': [2.6, 6.3, 2.966667, 1.650000, 3.3], 'feature2': [55, 18.333333, 18.333333, 44, 69], 'feature3': [0.266667, 0.5, 0.3, 0.000000, 0.000000], 'feature4': [22, 22.666667, 46, 16.500000, 33], 'feature5': [17.333333, 17.333333, 52, 26.500000, 53] })
解决方案
方法一:合并DataFrame后填充
先将两个DataFrame按Subid合并,再用df2的对应列填充df1的NaN,最后清理多余列:
# 合并df1和df2,添加后缀区分填充值列 merged_df = df1.merge(df2, on='Subid', suffixes=('', '_fill')) # 遍历特征列,用填充值替换NaN for col in df1.columns[2:]: merged_df[col] = merged_df[col].fillna(merged_df[f'{col}_fill']) # 保留原始列并调整小数位数 outputdf = merged_df[df1.columns].round(6) print(outputdf)
方法二:分组+字典映射填充
将df2转换为以Subid为键的字典,再按Subid分组填充:
# 将df2转为字典,key为Subid,value为对应特征填充值 fill_mapping = df2.set_index('Subid').to_dict('index') # 分组后用对应填充值替换NaN outputdf = df1.groupby('Subid').apply(lambda group: group.fillna(fill_mapping[group.name])).reset_index(drop=True) outputdf = outputdf.round(6) print(outputdf)
两种方法均可得到符合预期的结果,round(6)是为了匹配示例输出的小数位数,可根据实际需求调整。
内容的提问来源于stack exchange,提问作者Hussain Madarwala
相关产品推荐
相关产品推荐

