【问题标题】:pandas .diff() but use first cell as difference between last cell in prior columnpandas .diff() 但使用第一个单元格作为前一列中最后一个单元格之间的差异
【发布时间】:2021-03-31 18:57:27
【问题描述】:

假设我有一个格式如下的 df:

year        2016  2017  2018  2019  2020  min  max    avg
month                                                    
2021-01-01   284   288   311   383   476  284  476  357.4
2021-02-01   301   315   330   388   441  301  441  359.6
2021-03-01   303   331   341   400   475  303  475  375.4
2021-04-01   283   300   339   419   492  283  492  372.6
2021-05-01   287   288   346   420   445  287  445  359.7
2021-06-01   283   292   340   424   446  283  446  359.1
2021-07-01   294   296   360   444   452  294  452  370.3
2021-08-01   294   315   381   445   451  294  451  375.9
2021-09-01   288   331   405   464   459  288  464  385.6
2021-10-01   327   349   424   457   453  327  457  399.1
2021-11-01   316   351   413   469   471  316  471  401.0
2021-12-01   259   329   384   467   465  259  467  375.7

我想通过使用df['delta'] = df['2020'].diff()来获得2020年专栏的差异

这显然会为列中的第一个值返回 NaN。我怎样才能让它自动将该差异解释为 2020 年的第一个值和 2019 年的最后一个值之间的差异?

【问题讨论】:

  • 您的month 索引实际上是“一月”、“二月”、“三月”、...(甚至是 1、2、3...),而不是特定年份 2021-01-01 .为什么不让月份索引不那么混乱?
  • @scmi 这是由于图形滚动的代码错误,但我很想把这个问题弄清楚。月份指数通常是 Jan Feb Mar 等。
  • visualnotsobasic: 好的,但是对于所有关注这个的人来说,不要把你的索引命名为神秘和自相矛盾的东西。
  • 我不会完全称其为神秘或自相矛盾的......它也与问题无关。我对建设性的批评没有意见,但你实际上只是在这里寻找错误。
  • visualnotsobasic:不,我不是,这是建设性的。在这里,索引month=='2021-02-01' 实际上仅表示 2016..2020 年间的Feb。有一个真正的建设性观点,那就是 “我们应该如何最好地表示仅月份(作为日期?整数 1..12?枚举?字符串?分类?),以便我们在聚合中获得正确的排序顺序/stacking/pivoting(/plotting,因为 matplotlib 可能不理解)" 这也是我一直在努力解决的问题。熊猫可能很笨重。分类仍然不是一流的类型,并且不能真正在导出/导入中幸存下来。 (相比之下,R 做得更好)

标签: python pandas dataframe


【解决方案1】:

如果你只想要 2020 年:

df["delta"] = pd.concat([df["2019"], df["2020"]]).diff().tail(len(df))

打印:

          year  2016  2017  2018  2019  2020  min  max    avg  delta
0   2021-01-01   284   288   311   383   476  284  476  357.4    9.0
1   2021-02-01   301   315   330   388   441  301  441  359.6  -35.0
2   2021-03-01   303   331   341   400   475  303  475  375.4   34.0
3   2021-04-01   283   300   339   419   492  283  492  372.6   17.0
4   2021-05-01   287   288   346   420   445  287  445  359.7  -47.0
5   2021-06-01   283   292   340   424   446  283  446  359.1    1.0
6   2021-07-01   294   296   360   444   452  294  452  370.3    6.0
7   2021-08-01   294   315   381   445   451  294  451  375.9   -1.0
8   2021-09-01   288   331   405   464   459  288  464  385.6    8.0
9   2021-10-01   327   349   424   457   453  327  457  399.1   -6.0
10  2021-11-01   316   351   413   469   471  316  471  401.0   18.0
11  2021-12-01   259   329   384   467   465  259  467  375.7   -6.0

【讨论】:

    【解决方案2】:

    你可以试试unstack,然后试试diff,注意2016年的第一个项目还是NaN

    out = df.drop(['min','max','avg'],1).unstack().diff().unstack(0)
                2016  2017  2018  2019  2020
    2021-01-01   NaN  29.0 -18.0  -1.0   9.0
    2021-02-01  17.0  27.0  19.0   5.0 -35.0
    2021-03-01   2.0  16.0  11.0  12.0  34.0
    2021-04-01 -20.0 -31.0  -2.0  19.0  17.0
    2021-05-01   4.0 -12.0   7.0   1.0 -47.0
    2021-06-01  -4.0   4.0  -6.0   4.0   1.0
    2021-07-01  11.0   4.0  20.0  20.0   6.0
    2021-08-01   0.0  19.0  21.0   1.0  -1.0
    2021-09-01  -6.0  16.0  24.0  19.0   8.0
    2021-10-01  39.0  18.0  19.0  -7.0  -6.0
    2021-11-01 -11.0   2.0 -11.0  12.0  18.0
    2021-12-01 -57.0 -22.0 -29.0  -2.0  -6.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 2017-09-24
      • 2021-12-03
      • 1970-01-01
      相关资源
      最近更新 更多