【发布时间】:2019-08-14 12:58:39
【问题描述】:
我正在尝试使用基于列或按列分组的多列上的训练数据的平均值填充测试数据中的 nan 值。以下是部分测试数据:
date_block_num shop_id item_id item_category_id target item_price avg_item_price sum_item_cnt_day avg_item_cnt_day shop_avg_item_price ... avg_item_cnt_day_lag_12 shop_avg_item_price_lag_12 shop_sum_item_cnt_day_lag_12 shop_avg_item_cnt_day_lag_12 category_avg_item_price_lag_12 category_sum_item_cnt_day_lag_12 category_avg_item_cnt_day_lag_12 shop_avg_item_price_per_category_lag_12 shop_sum_item_cnt_per_category_lag_12 shop_avg_item_cnt_per_category_lag_12
0 26.5 5 5037 19.0 0.928571 1788.897788 1934.764286 90.714286 1.937141 868.822366 ... 0.383736 619.341077 181.571429 0.029328 716.813821 779.214286 0.084066 716.052585 10.285714 0.056515
1 NaN 5 5320 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 30.0 5 5233 19.0 1.428571 854.861715 842.778086 72.428571 1.685456 914.767445 ... 0.000000 597.460870 0.000000 0.000000 591.507516 0.000000 0.000000 591.790514 0.000000 0.000000
3 32.0 5 5232 23.0 0.333333 728.018465 790.297277 47.000000 1.100087 965.966832 ... 0.000000 597.460870 0.000000 0.000000 591.507516 0.000000 0.000000 591.790514 0.000000 0.000000
4 NaN 5 5268 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
5 rows × 102 columns
所以我想用基于 item_id 的列的平均值替换 nans。
首先我知道我可以得到按 item_id 分组的火车数据列的平均值,如下所示:
mt = train.groupby('item_id').apply(lambda x: np.mean(x))
然后我看到我尝试对测试集中的每一列使用fillna,如下所示:
for col in test.columns:
test[col] = test.groupby('item_id')[col].apply(lambda x: x.fillna...)
我不知道如何用火车的平均值替换而不是测试。怎么做?这是最好的方法还是有更好的方法?谢谢。
【问题讨论】:
-
您能否通过
print(df.head())并将输出粘贴到您的问题中来提供您作为图片包含的数据?我们可能不需要所有列来回答问题,所以我也会通过以下方式对列进行子选择:df[[date_bock_num, shop_id..]] -
我试过了,但是复制粘贴没有正确显示输出。我做到了,但显示不正确。
-
选择无关紧要。这就是 nans 是如何填充其他集合的值的。任何显示其工作原理的示例都可以。
-
您的
train和test数据框的形状是否相同?列数和行数一样吗? -
在从 train 添加额外功能后只有相同数量的列
标签: python pandas pandas-groupby apply fillna