Pandas groupby与pct_change

时间:2016-10-26 22:40:04

标签: python pandas numpy

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

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

但这会返回所有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

3 个答案:

答案 0 :(得分:5)

您希望将日期纳入行索引,将组/公司纳入列

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

enter image description here

然后使用pct_change

d1.pct_change()

enter image description here

OR

with groupby

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

enter image description here

答案 1 :(得分:3)

我不确定groupby方法是否至少按照熊猫0.23.4版本的预期运行。

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

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

Incorrect Outcome

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

Correct Outcome

答案 2 :(得分:1)

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