【问题标题】:Plot the result of a groupby operation in pandas在 pandas 中绘制 groupby 操作的结果
【发布时间】:2018-02-24 02:30:43
【问题描述】:

我有这个示例表:

    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 和日期分组后,我正试图使我的表最终表如下所示。

    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 和 Date 的所有 Volume/Day 值。所以我可以使用它们进行进一步的计算和绘制 Volume/Day 与 CumDays 的关系。以 ID:111 为例,Volume/Day 的第一个值将仅为 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

这样做,累积计算根本不生效。它返回原始的 Days 值。这不允许我进一步提取 Volume/Day 的第一个值、所有 CumDays 值和我需要的所有 Volume/Day 值。任何关于如何去做的建议或帮助将不胜感激。谢谢

【问题讨论】:

  • 你为什么发布html?这是您接收数据的方式吗?
  • @piRSquared,没有。这是我组织的,所以它可以在 S.O. 上看到。除了以 html 形式表示或拍照之外,还有其他更好的方法可以在 S.O 上显示表格吗?
  • 我们看到的只是原始的 HTML,除非我们点击运行 sn-p。相反,粘贴数据文本并突出显示该文本,然后单击类似于 {} 的按钮。这将使每行缩进四个空格。这反过来又以方便的方式展示您的餐桌,以便我们为您提供帮助
  • @piRSquared,非常感谢。想了想,我只能将该实用程序用于代码。做了一些更新。我想知道这现在看起来是否更好
  • 看看那些漂亮的表格(-:除了接受@cᴏʟᴅsᴘᴇᴇᴅ 的答案之外,您可能还想考虑投票。

标签: python pandas matplotlib group-by pandas-groupby


【解决方案1】:

获取groupby 对象。

g = df.groupby('ID')

transform计算列:

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

如果您想要分组图,您可以在按ID 分组后迭代每个组。要绘图,首先设置索引并调用plot

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

【讨论】:

  • @COLDSPEED,感谢您的及时回复。代码选择了第一个值和所有值。但是,剧情能不能像现在一样,用ID分开,而不是连在一起。所以每个ID都有自己的情节。在这种情况下,2 个地块。那可能吗?谢谢
  • @dlvr 用单独的行编辑了一个解决方案。
  • @COLDSPEED,我的意思是,单独的图表。一张图表为 111,第二张图表为 112。这可能吗?谢谢
  • @dlvr 您可以考虑查看stackoverflow.com/questions/34225839/…。如果没有帮助,请打开一个新问题,并且具有更多绘图专业知识的人可能会提供帮助。您也可以投票答案,请考虑这样做。谢谢你:)
  • @COLDSPEED,您指出我提出的问题使它成为现实,我也赞成它。谢谢您的时间。非常感谢
猜你喜欢
  • 2013-03-06
  • 2016-02-09
  • 2018-03-14
  • 2022-11-16
  • 2017-01-20
  • 2013-07-14
  • 2015-09-09
  • 2017-03-07
  • 1970-01-01
相关资源
最近更新 更多