Python 在pandas中绘制groupby操作的结果
我有这个样本表:Python 在pandas中绘制groupby操作的结果,python,pandas,matplotlib,group-by,pandas-groupby,Python,Pandas,Matplotlib,Group By,Pandas Groupby,我有这个样本表: ID Date Days Volume/Day 0 111 2016-01-01 20 50 1 111 2016-02-01 25 40 2 111 2016-03-01 31 35 3 111 2016-04-01 30 30 4 111 2016-05-01 31 25 5 111 2016-06-01 30 20 6 111 2016-07-01 31 20 7 111 2016-08-0
ID Date Days Volume/Day
0 111 2016-01-01 20 50
1 111 2016-02-01 25 40
2 111 2016-03-01 31 35
3 111 2016-04-01 30 30
4 111 2016-05-01 31 25
5 111 2016-06-01 30 20
6 111 2016-07-01 31 20
7 111 2016-08-01 31 15
8 111 2016-09-01 29 15
9 111 2016-10-01 31 10
10 111 2016-11-01 29 5
11 111 2016-12-01 27 0
0 112 2016-01-01 31 55
1 112 2016-02-01 26 45
2 112 2016-03-01 31 40
3 112 2016-04-01 30 35
4 112 2016-04-01 31 30
5 112 2016-05-01 30 25
6 112 2016-06-01 31 25
7 112 2016-07-01 31 20
8 112 2016-08-01 30 20
9 112 2016-09-01 31 15
10 112 2016-11-01 29 10
11 112 2016-12-01 31 0
在按ID和日期分组后,我试图使我的表final表如下所示
ID Date CumDays Volume/Day
0 111 2016-01-01 20 50
1 111 2016-02-01 45 40
2 111 2016-03-01 76 35
3 111 2016-04-01 106 30
4 111 2016-05-01 137 25
5 111 2016-06-01 167 20
6 111 2016-07-01 198 20
7 111 2016-08-01 229 15
8 111 2016-09-01 258 15
9 111 2016-10-01 289 10
10 111 2016-11-01 318 5
11 111 2016-12-01 345 0
0 112 2016-01-01 31 55
1 112 2016-02-01 57 45
2 112 2016-03-01 88 40
3 112 2016-04-01 118 35
4 112 2016-05-01 149 30
5 112 2016-06-01 179 25
6 112 2016-07-01 210 25
7 112 2016-08-01 241 20
8 112 2016-09-01 271 20
9 112 2016-10-01 302 15
10 112 2016-11-01 331 10
11 112 2016-12-01 362 0
接下来,我希望能够提取每个ID的第一个Volume/Day值、所有CumDays值以及每个ID和日期的所有Volume/Day值。因此,我可以使用它们进行进一步的计算,并绘制体积/天与累计天的对比图。例如,对于ID:111,卷/天的第一个值将仅为50,而ID:112的第一个值将仅为55。ID:111的所有CumDays值将为20,45。。。和ID:112,它将是31,57…对于所有卷/天ID:111,将是50,40。。。ID:112将是55,45
我的解决方案:
def get_time_rate(grp_df):
t = grp_df['Days'].cumsum()
r = grp_df['Volume/Day']
return t,r
vals = df.groupby(['ID','Date']).apply(get_time_rate)
vals
这样做,累积计算根本不会生效。它返回原始的天数值。这不允许我进一步提取Volume/Day的第一个值、所有CumDays值和我需要的所有Volume/Day值。任何关于如何进行的建议或帮助都将不胜感激。谢谢获取groupby对象
使用转换计算列:
如果您想要分组绘图,可以在按ID分组后迭代每个组。要进行绘图,首先设置索引并调用绘图
获取groupby对象
使用转换计算列:
如果您想要分组绘图,可以在按ID分组后迭代每个组。要进行绘图,首先设置索引并调用绘图
你为什么发布html?这就是您接收数据的方式吗?@piRSquared,不是。这是我组织数据的方式,以便它可以在S.O上显示。除了以html形式表示或拍照外,还有其他更好的方式在S.O上显示表吗?我们看到的只是原始html,除非单击“运行代码段”。相反,粘贴数据文本并突出显示该文本,然后单击类似{}的按钮。这将使每行缩进四个空格。这反过来又以一种方便的方式展示了您的桌子,我们可以提供帮助you@piRSquared,非常感谢。我想,我只能将该实用程序用于代码。做了一些更新。我想知道现在看这些漂亮的桌子是否更好?——你可能想考虑投票ᴏʟᴅsᴘᴇᴇᴅ 除了接受它,还有一个答案。你为什么发布html?这就是您接收数据的方式吗?@piRSquared,不是。这是我组织数据的方式,以便它可以在S.O上显示。除了以html形式表示或拍照外,还有其他更好的方式在S.O上显示表吗?我们看到的只是原始html,除非单击“运行代码段”。相反,粘贴数据文本并突出显示该文本,然后单击类似{}的按钮。这将使每行缩进四个空格。这反过来又以一种方便的方式展示了您的桌子,我们可以提供帮助you@piRSquared,非常感谢。我想,我只能将该实用程序用于代码。做了一些更新。我想知道现在看这些漂亮的桌子是否更好?——你可能想考虑投票ᴏʟᴅsᴘᴇᴇᴅ “除了接受它之外,我们还需要你的回答。”COLDSPEED,谢谢你的及时回复。选择第一个值和所有值的代码起作用。但是,绘图可以用ID分隔,而不能像现在这样连接在一起。所以每个ID都有自己的绘图。在本例中,2个绘图。可能吗?Thanks@dlvr用单独的行编辑了一个解决方案。@COLDSPEED,我实际上是指单独的图表。一张图表显示111,第二张图表显示112。可能吗?Thanks@dlvr你可以考虑看看。如果没有帮助,打开一个新的问题,有更多绘图专业知识的人可能会提供帮助。你也可以投票表决,请考虑这样做。谢谢:@COLDSPEED,你指给我的问题让我成功了,我也投了更高的票。谢谢你抽出时间。很appreciated@COLDSPEED,谢谢您的及时回复。选择第一个值和所有值的代码起作用。但是,绘图可以用ID分隔,而不能像现在这样连接在一起。所以每个ID都有自己的绘图。在本例中,2个绘图。可能吗?Thanks@dlvr用单独的行编辑了一个解决方案。@COLDSPEED,我实际上是指单独的图表。一张图表显示111,第二张图表显示112。可能吗?Thanks@dlvr你可以考虑看看。如果没有帮助,打开一个新的问题,有更多绘图专业知识的人可能会提供帮助。你也可以投票表决,请考虑这样做。谢谢:@COLDSPEED,你指给我的问题让我成功了,我也投了更高的票。谢谢你抽出时间。非常感谢
g = df.groupby('ID')
df['CumDays'] = g.Days.transform('cumsum')
df['First Volume/Day'] = g['Volume/Day'].transform('first')
df
ID Date Days Volume/Day CumDays First Volume/Day
0 111 2016-01-01 20 50 20 50
1 111 2016-02-01 25 40 45 50
2 111 2016-03-01 31 35 76 50
3 111 2016-04-01 30 30 106 50
4 111 2016-05-01 31 25 137 50
5 111 2016-06-01 30 20 167 50
6 111 2016-07-01 31 20 198 50
7 111 2016-08-01 31 15 229 50
8 111 2016-09-01 29 15 258 50
9 111 2016-10-01 31 10 289 50
10 111 2016-11-01 29 5 318 50
11 111 2016-12-01 27 0 345 50
0 112 2016-01-01 31 55 31 55
1 112 2016-01-02 26 45 57 55
2 112 2016-01-03 31 40 88 55
3 112 2016-01-04 30 35 118 55
4 112 2016-01-05 31 30 149 55
5 112 2016-01-06 30 25 179 55
6 112 2016-01-07 31 25 210 55
7 112 2016-01-08 31 20 241 55
8 112 2016-01-09 30 20 271 55
9 112 2016-01-10 31 15 302 55
10 112 2016-01-11 29 10 331 55
11 112 2016-01-12 31 0 362 55
fig, ax = plt.subplots(figsize=(8,6))
for i, g in df2.groupby('ID'):
g.plot(x='CumDays', y='Volume/Day', ax=ax, label=str(i))
plt.show()