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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:25:37