如何用分组df_train的统计值填充另一分组df_test的缺失值
解决方案
实现代码
你原有写法的问题是给fillna传入了包含全部分组中位数的序列,无法和当前分组的索引匹配,调整transform内的逻辑,取当前分组对应的中位数即可:
# 基于groupby的实现 df_test['col_2'] = df_test.groupby('col_1')['col_2'].transform( lambda x: x.fillna(values_used_in_df_train[x.name]) )
原理解释
groupby('col_1')会将df_test按照col_1的取值切分为A、B、C三个独立的分组- 每个分组传入transform的lambda函数时,
x.name就是当前分组对应的col_1取值(比如A组的x.name就是'A') - 用
values_used_in_df_train[x.name]拿到训练集计算好的当前分组对应的中位数,仅用这一个值填充当前分组内的所有NaN,即可完成预期的填充逻辑
验证输出
运行后df_test的结果和预期完全一致:
col_1 col_2 0 A 3.0 1 A 2.5 2 A 1.0 3 A 2.0 4 B 2.0 5 C 1.0 6 C 1.0 7 B 3.0 8 B 2.0 9 B 2.0 10 C 1.0
内容的提问来源于stack exchange,提问作者mathnoob
相关产品推荐
相关产品推荐

