如何用Python按组填充数据集NA值(无需均值/众数)
按分组填充缺失值为组内任意有效值的Python实现
问题描述
现有包含缺失值的数据集:
group rate type feat. A #NA L 100 A 2 #NA 150 A 2 M 100 B 3 M #NA B #NA M #NA B #NA M 200 B #NA #NA 200 C 9 H 300 C 9 H 300
需求:按group分组,将每组内的缺失值(#NA)填充为该分组内任意一个现有有效值,无需使用均值或众数方法。示例输出如下:
group rate type feat. A 2 L 100 A 2 L 150 A 2 M 100 B 3 M 200 B 3 M 200 B 3 M 200 B 3 M 200 C 9 H 300 C 9 H 300
实现步骤与代码
使用Python的pandas库可以快速实现该需求,核心思路是按group分组后,用组内的任意非缺失值填充对应列的缺失值。
1. 导入库并构造数据集
首先将原始数据中的#NA替换为pandas识别的NaN:
import pandas as pd import numpy as np # 构造原始数据集,将#NA转换为NaN data = { 'group': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C'], 'rate': [np.nan, 2, 2, 3, np.nan, np.nan, np.nan, 9, 9], 'type': ['L', np.nan, 'M', 'M', 'M', 'M', np.nan, 'H', 'H'], 'feat.': [100, 150, 100, np.nan, np.nan, 200, 200, 300, 300] } df = pd.DataFrame(data)
2. 按分组填充缺失值
通过groupby分组后,使用transform对每个列执行填充操作,这里选择组内第一个非缺失值作为填充值(若需要随机选有效值,可替换为随机采样的方式):
# 按group分组,对每列填充组内第一个非缺失值 filled_df = df.groupby('group').transform(lambda x: x.fillna(x.dropna().iloc[0])) # 还原group列(transform会保留索引,需重新关联) filled_df['group'] = df['group'] # 调整列顺序与原始数据集一致 filled_df = filled_df[['group', 'rate', 'type', 'feat.']] # 打印结果 print(filled_df)
3. 输出结果
运行上述代码后,输出结果与示例一致:
group rate type feat. 0 A 2.0 L 100 1 A 2.0 L 150 2 A 2.0 M 100 3 B 3.0 M 200 4 B 3.0 M 200 5 B 3.0 M 200 6 B 3.0 M 200 7 C 9.0 H 300 8 C 9.0 H 300
可选:随机选择组内有效值填充
如果需要随机选择组内的有效值填充(而不是固定第一个),可以将填充逻辑改为随机采样:
filled_df = df.groupby('group').transform( lambda x: x.fillna(x.dropna().sample(1).iloc[0]) )
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

