熊猫按类别将负数替换为均值

时间:2018-12-04 20:48:04

标签: python pandas dataframe mean

我想按类别用均值替换列中的所有负值。 我可以轻松找到每个类别的平均值。 就像是 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:)

3 个答案:

答案 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)