Python Dataframe groupby日期和其他列

Python Dataframe groupby日期和其他列,python,pandas,Python,Pandas,我有一个数据框,它有三列:日期(Y-M-D)、店铺id和收入。我想将表按月份、店铺id进行分组,并将收入从最高值排列到最低值。该表有200万行,覆盖三年记录。您可以从我附加的链接查看该表。我试过这样的方法: monthSales.groupby((monthSales['date'].dt.strftime('%B'),monthSales['shop_id'])) please see this link: "paste.ofcode.org/GvTNdqtWWGTZR5ysJEKnV

我有一个数据框,它有三列:日期(Y-M-D)、店铺id和收入。我想将表按月份、店铺id进行分组,并将收入从最高值排列到最低值。该表有200万行,覆盖三年记录。您可以从我附加的链接查看该表。我试过这样的方法:

 monthSales.groupby((monthSales['date'].dt.strftime('%B'),monthSales['shop_id'])) 

 please see this link: "paste.ofcode.org/GvTNdqtWWGTZR5ysJEKnVQ" to 
 copy the toy table
我该怎么做?谢谢你的帮助

可复制格式的数据:

    date    shop_id revenue
0   2013-01-02  59  22131846.0
1   2013-01-23  24  22131846.0
2   2013-01-20  27  22131846.0
3   2013-01-02  25  22131846.0
4   2013-01-03  25  22131846.0
5   2013-01-20  25  22131846.0
6   2013-01-23  25  22131846.0
7   2013-01-26  25  22131846.0
8   2013-01-27  6   22131846.0
9   2013-01-10  15  22131846.0
10  2013-01-10  7   22131846.0
11  2013-01-05  31  22131846.0
12  2013-01-02  54  22131846.0
13  2013-01-14  42  22131846.0
14  2013-01-26  38  22131846.0
15  2013-01-20  37  22131846.0
16  2013-01-02  46  22131846.0
17  2013-01-08  44  22131846.0
18  2013-02-05  51  14555178.0
19  2013-02-12  54  22131846.0
20  2013-02-12  16  22131846.0
21  2013-02-22  1   14555178.0
22  2013-02-10  0   14555178.0
23  2013-02-05  0   14555178.0
24  2013-03-21  28  22131846.0

.groupby
获取要分组的列或列列表,并期望在最后应用一个函数

列应该作为标题传递给
.groupby
,而不是列本身:只是名称作为字符串。因为在数据帧上调用了
.groupby
,Pandas可以确定您指的是列

df.groupby(by=['date','shop\u id'])

正确地传入列后,需要在末尾添加函数以实际计算任何内容。在本例中,您需要
sum
函数

df.groupby(by=['date','shop\u id']).sum()

然后,您可以使用
对数据帧进行排序。按常规对值进行排序

您还需要使用
pd.to\u datetime
将您的
date
列转换为实际日期,并在对所有内容进行分组之前提取月份(可能是另一列),否则排序将无法满足您的要求


我认为此代码符合您的要求:

monthSales.loc[:, "date"] = pd.to_datetime(monthSales["date"])
monthSales["month"] = monthSales["date"].dt.strftime('%m')
monthSales.groupby(["month", "shop_id"]).sum().sort_values('month')
如果您还想保留年份(而不是摆弄多个索引):

如果你真的想搞乱多重索引:

monthSales.loc[:, "date"] = pd.to_datetime(monthSales["date"])
monthSales.set_index('date', inplace=True)
monthSales.groupby([monthSales.index.year.values,
                    monthSales.index.month.values, "shop_id"]).sum()

您应该首先构建一个月列。如果date列具有datetime数据类型,则可以减去天数并添加1以获得当天的第一个月。如果它是字符串类型,则可以对前7个字符进行切片

完成后,您首先按该月列分组,并对每个部分应用sort_值,升序=False

熊猫代码可以是(日期时间示例):

给予:

                        revenue
month      shop_id             
2013-01-01 25       110659230.0
           6         22131846.0
           7         22131846.0
           15        22131846.0
           24        22131846.0
           27        22131846.0
           31        22131846.0
           37        22131846.0
           38        22131846.0
           42        22131846.0
           44        22131846.0
           46        22131846.0
           54        22131846.0
           59        22131846.0
2013-02-01 0         29110356.0
           16        22131846.0
           54        22131846.0
           1         14555178.0
           51        14555178.0
2013-03-01 28        22131846.0

不要张贴图片!我们无法复制数据以复制…@SergeBallesta,请查看我所附的链接。Stackoverflow不允许我粘贴表代码。谢谢我是为你做的。您应该使用该链接查看如何操作。@Pertitract,我将运行测试。但是我试了很多次,第3-7行(shop_id 25)就是不能组合在一起。“我很快会告诉你的。”Pertitract,结果与我粘贴的表格相同。顺便说一句,当它按日期分组时,它没有显示在month@Petriact,谢谢你的帮助!这一次,我发现这一年不见了:)我的意思是,如果我运行sql代码,我想要像groupby(“月”、“店铺id”)这样的东西。。差不多that@almo我用另外两个选项进行了重新编辑,这两个选项都保留了这一年。看看这两个是否符合你的要求。@Petriact,谢谢。我认为你的解决方案很好,但我更喜欢Serge的解决方案。谢谢
df.assign(month=df.date + pd.to_timedelta(1 - df.date.dt.day, 'D')).groupby(
    ['month']).apply(lambda x: x.groupby(['shop_id']).sum().sort_values(
            'revenue', ascending=False))
                        revenue
month      shop_id             
2013-01-01 25       110659230.0
           6         22131846.0
           7         22131846.0
           15        22131846.0
           24        22131846.0
           27        22131846.0
           31        22131846.0
           37        22131846.0
           38        22131846.0
           42        22131846.0
           44        22131846.0
           46        22131846.0
           54        22131846.0
           59        22131846.0
2013-02-01 0         29110356.0
           16        22131846.0
           54        22131846.0
           1         14555178.0
           51        14555178.0
2013-03-01 28        22131846.0