Группируйте ежедневные данные по месяцам и считайте объекты на пользователя - PullRequest
1 голос
/ 16 июня 2019

Я пытаюсь сгруппировать количество товаров по месяцам и пользователям.У меня есть ежедневные данные, поэтому сначала я группирую их по месяцам, а затем по пользователям.См. Таблицу ниже:

Date         UserID Product
2016-02-02  1   Chocolate
2016-03-03  22  Chocolate
2016-03-03  22  Banana
2016-03-03  22  Banana
2016-03-03  22  Chocolate
2016-04-03  22  Chocolate
2016-04-03  22  Banana
2016-04-03  33  Banana
2016-04-03  33  Chocolate
2016-04-03  22  Peanuts
2016-04-03  33  Peanuts
2016-04-03  33  Peanuts

Мой результат должен выглядеть примерно так:

Date     UserID   Product     Count
2016-03  22       Banana      2
2016-03  22       Chocolate   2
2016-04  22       Banana      1
2016-04  22       Peanuts     1
2016-04  33       Banana      1
2016-04  33       Peanuts     2
2016-4   33       Chocolate   1

Мне нужно сделать это с пантами Python, и я не могу

сэтот код

dfcount = df(['Date','UserID','Product']).Kit.count()

Я получаю счет, но за день, как я могу сделать это в месяц?

Я пробовал это:

df[['Date', 'UserID', 'Product']].groupby(pd.Grouper(key='Date', freq='1M')).sum().sort_values(by='Date', ascending=True)['Product']

Это не такработа

Возвращает, что не распознает столбец моего продукта, но, вероятно, моя группировка неверна.


KeyError: 'Product'

Ответы [ 3 ]

0 голосов
/ 16 июня 2019
df['Date'] = pd.to_datetime(df.Date).dt.to_period('1M')
df['Count'] = 1
df.groupby(by=['Date','UserID','Product']).agg({'Count':'sum'}).reset_index().sort_values(by=['Date','UserID'])

Выход:

+---+---------+--------+-----------+-------+
|   |  Date   | UserID |  Product  | Count |
+---+---------+--------+-----------+-------+
| 0 | 2016-02 |      1 | Chocolate |     1 |
| 1 | 2016-03 |     22 | Banana    |     2 |
| 2 | 2016-03 |     22 | Chocolate |     2 |
| 3 | 2016-04 |     22 | Banana    |     1 |
| 4 | 2016-04 |     22 | Chocolate |     1 |
| 5 | 2016-04 |     22 | Peanuts   |     1 |
| 6 | 2016-04 |     33 | Banana    |     1 |
| 7 | 2016-04 |     33 | Chocolate |     1 |
| 8 | 2016-04 |     33 | Peanuts   |     2 |
+---+---------+--------+-----------+-------+
0 голосов
/ 16 июня 2019

Я бы сначала преобразовал столбец в Datetime, потому что это позволяет легко извлечь год / месяц / день (выполнив df.<date column>.dt.<year/month/day>).

df['Date'] = df.Date.apply(lambda x: pd.to_datetime(x, format='%Y-%m-%d'))

Затем для группировки по месяцу, клиенту и продукту:

counts = (df.groupby([df.Date.dt.month, 
                      'UserID', 
                      'Product']).count())
print(counts)

                       Date
Date UserID Product        
2    1      Chocolate     1
3    22     Banana        2
            Chocolate     2
4    22     Banana        1
            Chocolate     1
            Peanuts       1
     33     Banana        1
            Chocolate     1
            Peanuts       2

Здесь, если вы получаете больше данных, охватывающих более одного года, вышеуказанное решение позволяет вампо-прежнему группа по месяцам в одиночку.Если вместо этого вы хотите сгруппировать продукты и пользователей по годам, а также месяцам в этом новом расширенном наборе данных, вы можете просто добавить извлечение года в свою группу следующим образом:

counts = (df.groupby([df.Date.dt.year, 
                      df.Date.dt.month, 
                      'UserID', 
                      'Product']).count())

print(counts)

                            Date
Date Date UserID Product        
2016 2    1      Chocolate     1
     3    22     Banana        2
                 Chocolate     2
     4    22     Banana        1
                 Chocolate     1
                 Peanuts       1
          33     Banana        1
                 Chocolate     1
                 Peanuts       2
2017 2    1      Chocolate     1
     3    22     Banana        2
                 Chocolate     1

Таким образом, выбыть более ясным о том, как вы группируете свои данные (и, следовательно, с меньшей вероятностью позже получите неожиданные результаты)

0 голосов
/ 16 июня 2019

Если Date является строкой, вы можете

df.groupby([df.Date.str[:7], 'UserID', 'Product']).count()

                          Date
Date    UserID Product        
2016-02 1      Chocolate     1
2016-03 22     Banana        2
               Chocolate     2
2016-04 22     Banana        1
               Chocolate     1
               Peanuts       1
        33     Banana        1
               Chocolate     1
               Peanuts       2

Со столбцом даты и времени:

df.groupby([df.Date.dt.to_period('M'), 'UserID', 'Product']).count()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...