Сумма значений по группам по условию - PullRequest
0 голосов
/ 23 декабря 2018

Я работаю над набором данных какого-то старого конкурента Kagle,

Я хочу сделать несколько агрегаций из одной из таблиц:

Чтобы узнать, в какие дни скидка больше,мой ожидаемый результат выглядит следующим образом:

enter image description here enter image description here

Для этого я попытался с этим кодом:

coupon_list[[ 'USABLE_DATE_MON', 'USABLE_DATE_TUE', 'USABLE_DATE_WED',
       'USABLE_DATE_THU', 'USABLE_DATE_FRI', 'USABLE_DATE_SAT',
       'USABLE_DATE_SUN','DISCOUNT_PRICE']].melt("DISCOUNT_PRICE").groupby("variable").agg({"DISCOUNT_PRICE":sum,"value":sum})

Но для этой агрегации disscount_price является средним значением по всей таблице, а не средним по дням.

enter image description here

Чтобы решить эту проблему, я создал новую таблицу:

coupon_list_usable["DISCOUNT_PRICE"] =  coupon_list_usable.apply(lambda x: x.DISCOUNT_PRICE if x.value==1 else 0,axis=1 )

coupon_list_usable.groupby("variable").agg({"DISCOUNT_PRICE":sum,"value":sum}).reset_index()[["variable","DISCOUNT_PRICE"]].set_index("variable").plot.bar()

Но это не питонное решение, возможно ли этосделать это в самой группе?

1 Ответ

0 голосов
/ 23 декабря 2018

Используйте query для строк фильтра с 1 и для совокупного использования GroupBy.sum:

Примечание: dropna здесь не можетиспользовать, поскольку в столбцах данных о днях есть также значения 2.

s = (coupon_list.melt("DISCOUNT_PRICE")
                 .query('value == 1')
                 .groupby("variable")['DISCOUNT_PRICE']
                 .sum())

s.plot.bar()

Порядок дней также можно изменить с помощью reindex или ordered Categorical s:

days = ['USABLE_DATE_MON', 'USABLE_DATE_TUE', 'USABLE_DATE_WED',
       'USABLE_DATE_THU', 'USABLE_DATE_FRI', 'USABLE_DATE_SAT',
       'USABLE_DATE_SUN']

s = (coupon_list.melt("DISCOUNT_PRICE")
                 .query('value == 1')
                 .groupby("variable")['DISCOUNT_PRICE']
                 .sum()
                 .reindex(days))

days = ['USABLE_DATE_MON', 'USABLE_DATE_TUE', 'USABLE_DATE_WED',
       'USABLE_DATE_THU', 'USABLE_DATE_FRI', 'USABLE_DATE_SAT',
       'USABLE_DATE_SUN']

s = (coupon_list.melt("DISCOUNT_PRICE", var_name='days', value_name='data')
                .assign(days = lambda x: pd.Categorical(x['days'], 
                                                        ordered=True, 
                                                        categories=days))
                .query('value == 1')
                .groupby("days")['DISCOUNT_PRICE']
                .sum())

Образец :

coupon_list = pd.DataFrame({
         'USABLE_DATE_MON':[np.nan,np.nan,np.nan,1,1,np.nan],
         'USABLE_DATE_TUE':[1,np.nan,1,np.nan,1,np.nan],
         'USABLE_DATE_WED':[1,np.nan,np.nan,np.nan,1,1],
         'USABLE_DATE_THU':[1,1,np.nan,1,1,np.nan],
         'USABLE_DATE_FRI':[np.nan,1,2,np.nan,1,np.nan],
         'USABLE_DATE_SAT':[1,1,np.nan,1,1,2],
         'USABLE_DATE_SUN':[1,np.nan,1,1,1,1],
         'DISCOUNT_PRICE':[2,3,6,2,2,4],
})
print (coupon_list)
   USABLE_DATE_MON  USABLE_DATE_TUE  USABLE_DATE_WED  USABLE_DATE_THU  \
0              NaN              1.0              1.0              1.0   
1              NaN              NaN              NaN              1.0   
2              NaN              1.0              NaN              NaN   
3              1.0              NaN              NaN              1.0   
4              1.0              1.0              1.0              1.0   
5              NaN              NaN              1.0              NaN   

   USABLE_DATE_FRI  USABLE_DATE_SAT  USABLE_DATE_SUN  DISCOUNT_PRICE  
0              NaN              1.0              1.0               2  
1              1.0              1.0              NaN               3  
2              2.0              NaN              1.0               6  
3              NaN              1.0              1.0               2  
4              1.0              1.0              1.0               2  
5              NaN              2.0              1.0               4  

days = ['USABLE_DATE_MON', 'USABLE_DATE_TUE', 'USABLE_DATE_WED',
       'USABLE_DATE_THU', 'USABLE_DATE_FRI', 'USABLE_DATE_SAT',
       'USABLE_DATE_SUN']

s = (coupon_list.melt("DISCOUNT_PRICE", var_name='days', value_name='data')
                .assign(days = lambda x: pd.Categorical(x['days'], 
                                                        ordered=True, 
                                                        categories=days))
                .query('data == 1')
                .groupby("days")['DISCOUNT_PRICE']
                .sum())

print (s)
days
USABLE_DATE_MON     4
USABLE_DATE_TUE    10
USABLE_DATE_WED     8
USABLE_DATE_THU     9
USABLE_DATE_FRI     5
USABLE_DATE_SAT     9
USABLE_DATE_SUN    16
Name: DISCOUNT_PRICE, dtype: int64

s.plot.bar()

graph

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...