Pandas多列groupby,带有pct_change功能

19

我试图找到按 (公司组别日期 分组的每个唯一组别中 价值 的期间增长率。

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

你在这里遇到的问题是你想按多列进行分组,然后执行pct_change() - smci
3个回答

19

你想将日期放入行索引,将团体/公司放入列中

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

enter image description here

然后使用pct_change

d1.pct_change()

在此输入图片描述

或者

使用groupby

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

输入图像描述


5

我不确定 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

Correct Outcome


截至0.24.0版本,这似乎已经被修复了,所以务必更新到该版本。 - SimonR

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接