如何在groupby.apply之后避免使用索引进行数据透视?

时间:2017-03-16 08:18:17

标签: pandas

我目前正在处理时间序列数据,并希望计算天数之间的差异。这必须针对给定维度的所有实例单独发生。这是一个示例数据框:

import pandas as pd
df = pd.DataFrame({"date": pd.to_datetime(["2017-01-01", "2017-01-01", "2017-01-02", "2017-01-02", "2017-01-03", "2017-01-03", "2017-01-04", "2017-01-04"]), 
               "dim_1": [0, 1, 0, 1, 0, 1, 0, 1],
               "value": [50, 100, 70, 120, 150, 110, 130, 200]})

对于每个日期,dim_1组合都有价值。现在我提出了以下解决方案:

df.set_index("date").groupby(["dim_1"])\
    .apply(lambda x: x["value"] - x["value"].shift())

导致:

date   2017-01-01  2017-01-02  2017-01-03  2017-01-04
dim_1                                                
0             NaN        20.0        80.0       -20.0
1             NaN        20.0       -10.0        90.0

现在我必须融合数据框才能获得预期的结果:

pd.melt(df.set_index("date").groupby(["dim_1"])\
            .apply(lambda x: x["value"] - x["value"].shift()).reset_index(), 
        ["dim_1"])

导致:

   dim_1       date  value
0      0 2017-01-01    NaN
1      1 2017-01-01    NaN
2      0 2017-01-02   20.0
3      1 2017-01-02   20.0
4      0 2017-01-03   80.0
5      1 2017-01-03  -10.0
6      0 2017-01-04  -20.0
7      1 2017-01-04   90.0

当我按多个维度进行分组时,不会出现此问题。

我认为有一种更简单的方法可以实现这一结果,但我目前无法找到它。

非常感谢您提前!

1 个答案:

答案 0 :(得分:1)

您可以使用Groupby.diff()作为更好的选择,而不是通过使用apply移动索引轴来计算差异,结果效率会降低。

df.assign(value=df.groupby("dim_1")['value'].diff())

enter image description here