2017-03-16 8 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の組み合わせがあります。今、私は私の期待される結果を得るためにデータフレームを溶融する必要があり

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 

:に結果の

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

:今、私は、次の解決策を考え出した

に結果の
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

applyを使用してインデックス軸をシフトして差を計算するのではなく、結果として効率が低下する代わりに、Groupby.diff()を使用することをお勧めします。

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

enter image description here

関連する問題