Pandas groupby与pct_change

use*_*979 6 python numpy pandas

我试图找到每个唯一组的价值增长期,按公司,集团和日期分组.

Company Group Date     Value
A       X     2015-01  1
A       X     2015-02  2
A       X     2015-03  1.5
A       XX    2015-01  1
A       XX    2015-02  1.5
A       XX    2015-03  0.75
A       XX    2015-04  1
B       Y     2015-01  1
B       Y     2015-02  1.5
B       Y     2015-03  2
B       Y     2015-04  3
B       YY    2015-01  2
B       YY    2015-02  2.5
B       YY    2015-03  3
Run Code Online (Sandbox Code Playgroud)

我试过了:

df.groupby(['Date','Company','Group']).pct_change()
Run Code Online (Sandbox Code Playgroud)

但这会返回所有NaN.

我正在寻找的结果是:

Company Group Date     Value/People
A       X     2015-01  NaN
A       X     2015-02  1.0
A       X     2015-03  -0.25
A       XX    2015-01  NaN
A       XX    2015-02  0.5
A       XX    2015-03  -0.5
A       XX    2015-04  0.33
B       Y     2015-01  NaN
B       Y     2015-02  0.5
B       Y     2015-03  0.33
B       Y     2015-04  0.5
B       YY    2015-01  NaN
B       YY    2015-02  0.25
B       YY    2015-03  0.2
Run Code Online (Sandbox Code Playgroud)

piR*_*red 8

您希望将日期输入行索引,将组/公司添加到列中

d1 = df.set_index(['Date', 'Company', 'Group']).Value.unstack(['Company', 'Group'])
d1
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然后用 pct_change

d1.pct_change()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

要么

与groupby

df['pct'] = df.sort_values('Date').groupby(['Company', 'Group']).Value.pct_change()
df
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Sim*_*onR 5

我不确定该groupby方法至少在 Pandas 0.23.4 中是否能按预期工作。

df['pct'] = df.sort_values('Date').groupby(['Company', 'Group']).Value.pct_change()
Run Code Online (Sandbox Code Playgroud)

产生这个,这对于问题的目的来说是不正确的:

错误的结果

Index+Stack 方法仍然按预期工作,但您需要进行额外的合并才能将其转换为请求的原始形式。

d1 = df.set_index(['Date', 'Company', 'Group']).Value.unstack(['Company', 'Group'])
d1 = d1.pct_change().stack([0,1]).reset_index()
df = df.merge(d1, on=['Company', 'Group', 'Date'], how='left')
df.rename(columns={0: 'pct'}, inplace=True)
df
Run Code Online (Sandbox Code Playgroud)

正确的结果