Pandas groupby 多列,pct_change

Pandas groupby multiple columns, with pct_change

我试图找出每个独特组在 Value 中的周期性增长,按(CompanyGroupDate 分组).

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

我试过:

df.groupby(['Date','Company','Group']).pct_change()

但是这个 returns 都是 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

您想将日期放入行索引并 groups/company 放入列

d1 = df.set_index(['Date', 'Company', 'Group']).Value.unstack(['Company', 'Group'])
d1

然后使用pct_change

d1.pct_change()

与groupby

df['pct'] = df.sort_values('Date').groupby(['Company', 'Group']).Value.pct_change()
df

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

df['pct'] = df.sort_values('Date').groupby(['Company', 'Group']).Value.pct_change()

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

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

df['Pct_Change'] = df.groupby(['Company','Group'])['Value'].pct_change()