首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将每日数据按月分组并对每个用户的对象进行计数。

将每日数据按月分组并对每个用户的对象进行计数。
EN

Stack Overflow用户
提问于 2019-06-15 22:42:24
回答 3查看 167关注 0票数 1

我正试图按月和用户对产品数量进行分组。我有每天的数据,所以首先我有分组的几个月,然后每个用户。见下表:

代码语言:javascript
复制
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

我的结果应该是:

代码语言:javascript
复制
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

我需要和巨蟒熊猫一起做这件事,但我不能

用这个代码

代码语言:javascript
复制
dfcount = df(['Date','UserID','Product']).Kit.count()

我确实得到了一个数字,但每天,我如何能做到每月?

我试过这个:

代码语言:javascript
复制
df[['Date', 'UserID', 'Product']].groupby(pd.Grouper(key='Date', freq='1M')).sum().sort_values(by='Date', ascending=True)['Product']

它不起作用

它返回它不识别我的产品列,但是我的分组可能是错误的。

KeyError:“产品”

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-16 00:19:13

我首先将该列转换为Datetime,因为这样可以轻松提取年份/月/日(通过执行df.<date column>.dt.<year/month/day>)。

代码语言:javascript
复制
df['Date'] = df.Date.apply(lambda x: pd.to_datetime(x, format='%Y-%m-%d'))

然后,按月、客户和产品分组:

代码语言:javascript
复制
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

在这里,如果您获得的数据跨度超过一年,上述解决方案允许您仍然按月分组。如果您想在这个新的扩展数据集中按年和按月对产品和用户进行分组,您可以简单地将年份提取添加到您的群中,如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-06-15 23:29:48

如果Date是字符串,则可以

代码语言:javascript
复制
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

有一个datetime列:

代码语言:javascript
复制
df.groupby([df.Date.dt.to_period('M'), 'UserID', 'Product']).count()
票数 0
EN

Stack Overflow用户

发布于 2019-06-15 23:30:36

代码语言:javascript
复制
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'])

输出:

代码语言:javascript
复制
+---+---------+--------+-----------+-------+
|   |  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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56614711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档