2017-03-16 72 views
1

我目前正在研究時間序列數據,並希望計算天數之間的差異。對於給定維度的所有實例,這必須單獨發生。下面是一個示例數據幀:如何避免在groupby.apply之後通過索引進行透視?

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

您可以使用Groupby.diff()作爲更好的替代方法,而不是通過使用apply來移動索引軸來計算差異,結果變得效率較低。

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

enter image description here

相關問題