Озадачен поведением Pandas в groupby

#python #pandas #pandas-groupby

#python #pandas #pandas-groupby

Вопрос:

У меня есть большой набор данных, который содержит, среди прочего, двоичную переменную:

 Transactions['has_acc_id_and_cus_id'].value_counts()
1    1295130
0     823869
Name: has_acc_id_and_cus_id, dtype: int64
  

Когда я группирую этот набор данных — Транзакции — используя эту конкретную двоичную переменную в качестве одной групповой переменной, я получаю сгруппированный набор данных — df100 — который имеет только один уровень вышеупомянутой двоичной переменной.

 df100 = Transactions.groupby(['acc_reg_year', 'acc_reg_month', 'year', 'month',
                              'has_acc_id_and_cus_id'])[['net_revenue']].agg(['sum', 'mean', 'count'])

df100['has_acc_id_and_cus_id'].value_counts()
1    1421
Name: has_acc_id_and_cus_id, dtype: int64
  

Комментарии:

1. has_acc_id_and_cus_id не должно быть столбца в groupby , это индекс. Я удивлен, что эта строка не выдает AttributeError

2. Вам не нужно , продолжение строки неявно заключено в квадратные скобки.

3. @Josh Да, вы правы. Я сбросил индекс, но из соображений краткости не включил команду. Извините, если это все-таки была плохая практика.

4. Полезно точно показать, какой код вы использовали, и точный результат, иначе люди будут введены в заблуждение таким образом.

Ответ №1:

Если вы действительно хотите просто groupby включить has_acc_id_and_cus_id , то нужной вам командой будет…

 df100 = Transactions[['has_acc_id_and_cus_id', 'net_revenue']].groupby(['has_acc_id_and_cus_id']).agg(['sum', 'mean', 'count'])
  

Это подмножество только переменной, которую вы хотите суммировать с помощью ( has_acc_id_and_cus_id ) и переменной, которую вы хотите суммировать ( net_revenue )…

 Transactions[['has_acc_id_and_cus_id', 'net_revenue']]
  

…затем вы группируете их по has_acc_id_and_cus_id

 Transactions[['has_acc_id_and_cus_id', 'net_revenue']].groupby('has_acc_id_and_cus_id')
  

…перед тем, как затем применить agg() функцию для получения желаемой статистики.

Ошибка, которую вы допустили, основываясь на заявленной вами цели суммирования по has_acc_id_and_cus_id одному, заключалась в наличии четырех других переменных, по которым вы группировали ( acc_reg_year , acc_reg_month , year и month ).

Если вы действительно хотите получить сводку по has_acc_id_and_cus_id внутри всех остальных, тогда ваш исходный код был правильным, но, возможно, в одном или нескольких из acc_reg_year , acc_reg_month , year и month когда has_acc_id_and_cus_id == 0 отсутствуют значения, поэтому проверьте свои данные…

 Transactions[Transactions[`has_acc_id_and_cus_id`] == 0][[`acc_reg_year`, `acc_reg_month`, `year`, `month`]].head(100)