我想按类别用均值替换列中的所有负值。
我可以轻松找到每个类别的平均值。
就像是
train_df1.groupby(train_df1['item_category'])['item_cnt_day'].mean()
。
item_category
Access 1.115664
Books 1.087056
CD 2.199036
CD games 1.361757
Card 1.421528
Consoles 1.298143
Consoles Games 1.242093
Delivery 8.261742
Phone games 1.232323
Name: item_cnt_day, dtype: float64
我在'item_cnt_day'列中也有一些负值(这是不可能的,因为要出售负量的牛奶或其他东西比较困难)。
我的“想法”是将'Books'
类别中的负值替换为'Books'
的均值,将'Consoles'
替换为'Consoles'
的均值,依此类推。
实际上,我不知道用这些负值来计算均值是否更好...
能帮我吗?是pandas.DataFrame btw:)
答案 0 :(得分:1)
IIUC,一种在单行代码中用mean
处理/替换负值的更好方法
train_df1['item_cnt_day'] = train_df1.groupby('item_category')['item_cnt_day'].transform(lambda x: np.where(x < 0, x.mean(), x))
我遇到了类似的问题,并尝试了@neves方法,但是对于具有多种数据类型的较大数据框,它导致了缺少值的问题。
答案 1 :(得分:0)
您可以使用.transform
将平均值作为一列添加到DataFrame:
train_df1["groupby_mean"] = train_df1.groupby(train_df1['item_category'])['item_cnt_day'].transform("mean")
然后使用numpy的where
应用条件:
train_df1["item_cnt_day"] = np.where(train_df1["item_cnt_day"]>=0, train_df1["item_cnt_day"], train_df1["groupby_mean"])
答案 2 :(得分:0)
最好的考虑方式是负数na。因此,让我们做吧:
train_df1[train_df1 < 0] = np.nan
现在,让新列的平均类别为:
grouped = train_df1.groupby('item_category')['item_cnt_day'].mean()
使用类别均值新建一列:
train_df1['category_mean'] = train_df1.merge(grouped, left_on='item_category', right_index=True)
现在填写na值:
train_df1.item_cnt_day.fillna(train_df1.category_mean)