Python 熊猫-按多个值分组?
我有一个数据框,包含按通话日期和持续时间记录的手机使用分钟数 如下所示(30行示例): 我想按用户id分组并调用日期,最终目标是计算一年中每个用户每月使用的分钟数 我想我可以通过使用以下工具来实现这一点:Python 熊猫-按多个值分组?,python,pandas,Python,Pandas,我有一个数据框,包含按通话日期和持续时间记录的手机使用分钟数 如下所示(30行示例): 我想按用户id分组并调用日期,最终目标是计算一年中每个用户每月使用的分钟数 我想我可以通过使用以下工具来实现这一点: calls.groupby(['user_id','call_date'])['duration'].sum() 但结果并不是我所期望的: user_id call_date 1000 2018-12-26 14.36 2018-12-27 48
calls.groupby(['user_id','call_date'])['duration'].sum()
但结果并不是我所期望的:
user_id call_date
1000 2018-12-26 14.36
2018-12-27 48.26
2018-12-28 29.00
2018-12-29 1.70
2018-12-30 4.22
2018-12-31 19.29
1001 2018-08-14 13.86
2018-08-16 23.46
2018-08-17 8.11
2018-08-18 1.74
2018-08-19 10.73
2018-08-20 7.32
2018-08-21 0.00
2018-08-23 8.50
2018-08-24 8.63
2018-08-25 35.39
2018-08-27 10.57
2018-08-28 19.91
2018-08-29 0.54
2018-08-31 22.38
2018-09-01 7.53
2018-09-02 10.27
2018-09-03 30.66
2018-09-04 0.00
2018-09-05 9.09
2018-09-06 10.06
我希望它能像user_id 1000、1月份所有通话时长合计、2月份所有通话时长合计等那样分组
一般来说,我对python和编程都是新手,不知道下一步该怎么做才能按用户id和月份对它们进行分组
提前感谢您提供的任何见解
问候,
Jared您的设置中有些地方不太正确。首先,您的两个表是相同的,所以我不确定这是剪切粘贴错误还是其他错误。以下是我如何处理您的数据。像这样加载它,注意我们显式地将
call\u date
转换为Datetime`
from io import StringIO
import pandas as pd
df = pd.read_csv(StringIO(
"""
id user_id call_date duration
0 1000_93 1000 2018-12-27 8.52
1 1000_145 1000 2018-12-27 13.66
2 1000_247 1000 2018-12-27 14.48
3 1000_309 1000 2018-12-28 5.76
4 1000_380 1000 2018-12-30 4.22
5 1000_388 1000 2018-12-31 2.20
6 1000_510 1000 2018-12-27 5.75
7 1000_521 1000 2018-12-28 14.18
8 1000_530 1000 2018-12-28 5.77
9 1000_544 1000 2018-12-26 4.40
10 1000_693 1000 2018-12-31 4.31
11 1000_705 1000 2018-12-31 12.78
12 1000_735 1000 2018-12-29 1.70
13 1000_778 1000 2018-12-28 3.29
14 1000_826 1000 2018-12-26 9.96
15 1000_842 1000 2018-12-27 5.85
16 1001_0 1001 2018-09-06 10.06
17 1001_1 1001 2018-10-12 1.00
18 1001_2 1001 2018-10-17 15.83
19 1001_4 1001 2018-12-05 0.00
20 1001_5 1001 2018-12-13 6.27
21 1001_6 1001 2018-12-04 7.19
22 1001_8 1001 2018-11-17 2.45
23 1001_9 1001 2018-11-19 2.40
24 1001_11 1001 2018-11-09 1.00
25 1001_13 1001 2018-12-24 0.00
26 1001_19 1001 2018-11-15 30.00
27 1001_20 1001 2018-09-21 5.75
28 1001_23 1001 2018-10-27 0.98
29 1001_26 1001 2018-10-28 5.90
30 1001_29 1001 2018-09-30 14.78
"""), delim_whitespace = True, index_col=0)
df['call_date'] = pd.to_datetime(df['call_date'])
然后使用
df.groupby(['user_id','call_date'])['duration'].sum()
是否按用户和每个日期进行预期分组:
如果您想按照您的建议按月分组,您可以使用Grouper
功能:
df.groupby(['user_id',pd.Grouper(key='call_date', freq='1M')])['duration'].sum()
产生
user_id call_date
1000 2018-12-31 116.83
1001 2018-09-30 30.59
2018-10-31 23.71
2018-11-30 35.85
2018-12-31 13.46
如果按照这些步骤得到的结果不同,请告诉我,我犯了一个错误,粘贴了两次初始数据集样本。请查看我答案的第二部分,看看它是否对你的工作有帮助!谢谢我不知道石斑鱼,我要仔细看看它的文档。
df.groupby(['user_id',pd.Grouper(key='call_date', freq='1M')])['duration'].sum()
user_id call_date
1000 2018-12-31 116.83
1001 2018-09-30 30.59
2018-10-31 23.71
2018-11-30 35.85
2018-12-31 13.46