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()