Python 熊猫-按多个值分组?

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

我有一个数据框,包含按通话日期和持续时间记录的手机使用分钟数

如下所示(30行示例):

我想按用户id分组并调用日期,最终目标是计算一年中每个用户每月使用的分钟数

我想我可以通过使用以下工具来实现这一点:

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