将每日数据分组为几个月,并为每个用户计数对象

时间:2019-06-15 22:42:24

标签: python pandas pandas-groupby

我正在尝试按月份和用户对产品计数进行分组。我有每日数据,因此首先将其按月分组,然后按用户分组。参见下表:

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:'产品'

3 个答案:

答案 0 :(得分:0)

如果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()

答案 1 :(得分:0)

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 |
+---+---------+--------+-----------+-------+

答案 2 :(得分:0)

我首先将列转换为日期时间,因为这样可以轻松提取年/月/日(通过执行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

在这里,如果您获得了跨越一年以上的更多数据,则上述解决方案使您仍然可以单独按月分组。相反,如果要在此新扩展的数据集中按年份和月份对产品和用户进行分组,则只需将年份提取添加到groupby中即可,如下所示:

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

这样,您将更清楚地了解如何对数据进行分组(因此,以后出现意外结果的可能性较小)