python - 在 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-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 的第一个交易量/天值、所有 CumDays 值以及每个 ID 和日期的所有交易量/天值。所以我可以使用它们进行进一步的计算和绘制体积/天与 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

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

最佳答案

获取一个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()

enter image description here

关于python - 在 pandas 中绘制 groupby 操作的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46230399/

相关文章:

python - 多次递归切片 np 数组是否有任何惩罚?

python - 如何获取</h3>和<br/>之间的文本值

python - 更改 Python 直方图 bin 中的计数

pandas - matplotlib:每个类别的箱线图

python - 在 matplotlib 中使用 specgram 创建对数频率轴谱图

python - 使用 Nginx 反向代理部署 Pylons?

python - 适用于容器的 Azure Web 应用程序无法连接到适用于 Postgres 的 Azure DB

python - 数据帧合并给出 `Process finished with exit code 137 (interrupted by signal 9: SIGKILL)`

python - 过滤 Pandas 系列数组

python - 如何将累积值转换为具有空值的 pandas 数据帧的增量值?