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