【问题标题】:Pandas groupby multiple columns, with pct_changePandas groupby 多列,带有 pct_change
【发布时间】:2017-03-09 11:13:08
【问题描述】:

我试图在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()

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

标签: python pandas pandas-groupby


【解决方案1】:

您希望将日期放入行索引并将组/公司放入列

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

然后使用pct_change

d1.pct_change()

与分组

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这似乎从 0.24.0 开始再次修复,因此请务必更新到该版本。
    【解决方案3】:
    df['Pct_Change'] = df.groupby(['Company','Group'])['Value'].pct_change()
    

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 2020-11-10
      • 2017-02-22
      • 2015-10-15
      • 1970-01-01
      • 2023-03-04
      • 2018-08-20
      • 2021-07-13
      • 2017-01-28
      相关资源
      最近更新 更多