Замените, где когда-либо, Продажи продукта <20 на среднее значение продаж в аналогичной группе для Python Dataframe. - PullRequest
0 голосов
/ 09 мая 2018

Я хочу вменять значения столбца «Продажи» в транзакции для данных (в Python).т.е. заменить где-либо продажи продукта <20 на среднее значение продаж соответствующей категории и бренда.</p>

Например, мои данные представлены в следующей структуре:

Category,Brand,Sales
Food    , pp  , 100 
Food    , pp  , 200
Food    , pp  , 10
Cream   , xy  , 40
Cream   , xy  , 2
Cream   , xy  , 60

Продажи в 3-й строке (для продуктов питания и pp), т. Е. 10 следует заменить на среднее значение всех продаж вгруппа Food и PP, т.е. 100 + 200/2 = 150 [исключая 3-ю строку, в которой объем продаж равен 10].То же самое относится к 5-му ряду, т. Е. 2 ​​следует заменить средним значением продаж сливок и xy, т. Е. (60 +40) / 2 = 50 [исключая 5-й ряд].

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Попробуйте тоже,

df.loc[df['Sales']<20,'Sales']=np.NaN
df['Sales']=df.groupby(['Category'])['Sales'].apply(lambda x: x.fillna(x.mean()))

выход

  Category Brand  Sales
0     Food    pp  100.0
1     Food    pp  200.0
2     Food    pp  150.0
3    Cream    xy   40.0
4    Cream    xy   50.0
5    Cream    xy   60.0
0 голосов
/ 09 мая 2018

Используйте transform для mean с на группу отфильтрованных значений того же размера, что и исходный df, поэтому возможно заменить условием на numpy.where:

a = df.groupby(['Category','Brand'])['Sales'].transform(lambda x: x[x >= 20].mean())
df['Sales'] = np.where(df['Sales'] < 20, a, df['Sales'])

Альтернативное решение:

a = df[df['Sales']>= 20].groupby(['Category','Brand'])['Sales'].mean()
b = df.drop('Sales', 1).join(a, on=['Category','Brand'])['Sales']
df['Sales'] = np.where(df['Sales'] < 20, b, df['Sales'])

print (df)
  Category Brand  Sales
0     Food    pp    100
1     Food    pp    200
2     Food    pp    150
3    Cream    xy     40
4    Cream    xy     50
5    Cream    xy     60
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...