我正在尝试按月份和用户对产品计数进行分组。我有每日数据,因此首先将其按月分组,然后按用户分组。参见下表:
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:'产品'
答案 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
这样,您将更清楚地了解如何对数据进行分组(因此,以后出现意外结果的可能性较小)