【问题标题】:Python Monthly Change Calculation (Pandas)Python 月度变化计算 (Pandas)
【发布时间】:2021-06-04 15:35:35
【问题描述】:

这是数据

id date population
1 2021-5 21
2 2021-5 22
3 2021-5 23
4 2021-5 24
1 2021-4 17
2 2021-4 24
3 2021-4 18
4 2021-4 29
1 2021-3 20
2 2021-3 29
3 2021-3 17
4 2021-3 22

我想计算每个 id 中人口的每月变化。所以结果将是:

id date delta
1 5 .2353
1 4 -.15
2 5 -.1519
2 4 -.2083
3 5 .2174
3 4 .0556
4 5 -.2083
4 4 .3182

delta :=(本月 - 上个月)/上个月

如何在熊猫中解决这个问题?我正在考虑 groupby,但不知道下一步该怎么做

请记住,可能还有更多日期。但结果总是

【问题讨论】:

  • 为什么是 ../ this month 而不是 ../last monthlast month 不是更有意义吗?
  • 哦,是的(本月 - 上个月)/上个月。谢谢指出
  • 你会称之为人口的相对每月变化

标签: python pandas


【解决方案1】:

先使用GroupBy.pct_change对列进行排序,最后按列删除错误行delta

df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(['id','date'], ascending=[True, False])

df['delta'] = df.groupby('id')['population'].pct_change(-1)

df = df.dropna(subset=['delta'])
print (df)
   id       date  population     delta
0   1 2021-05-01          21  0.235294
4   1 2021-04-01          17 -0.150000
1   2 2021-05-01          22 -0.083333
5   2 2021-04-01          24 -0.172414
2   3 2021-05-01          23  0.277778
6   3 2021-04-01          18  0.058824
3   4 2021-05-01          24 -0.172414
7   4 2021-04-01          29  0.318182

【讨论】:

    【解决方案2】:

    也许你可以试试:

    data['delta'] = data['population'].diff()
    data['delta'] /= data['population']
    

    使用这种方法,第一行将是 NaN,但对于其余的,这应该可以工作。

    许多问候 安德烈

    【讨论】:

    • 对不起。我将问题编辑到上面。 :) 更完整的问题
    【解决方案3】:

    试试这个:

    df.groupby('id')['population'].rolling(2).apply(lambda x: (x.iloc[0] - x.iloc[1]) / x.iloc[0]).dropna()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 2020-03-20
      • 2021-02-05
      • 2019-01-26
      • 1970-01-01
      相关资源
      最近更新 更多