2016-11-24 7 views
1

私はPandasデータフレームにインポートするいくつかのデータを持っています。このデータは、「累積的」であると、時系列にインデックスを付け、以下を参照:Python Pandasデータフレームから累積カラムを控除

     Raw data 
2016-11-23 10:00:00  48.6 
2016-11-23 11:00:00  158.7 
2016-11-23 12:00:00  377.8 
2016-11-23 13:00:00  591.7 
2016-11-23 14:00:00  748.5 
2016-11-23 15:00:00  848.2 

をデータは毎日更新されるので、時系列は一日、毎日を前方に移動します。

私が行う必要があるのは、このデータフレームを受け取り、以下に示すように新しい列を作成することです。最初の行は、単純に「生データ」列からデータをコピーします。後続の各行は「生データ」列からデータを取り出し、その前に現れた値を減算します。 158.7 - 48.6 = 110.1,377.8 - 158.7 = 219.1など

私はPython/Pandasの "Process data"列にどのように到達することができますか?

最後の充填NaNが第1の値によってRaw dataに:あなたはshift編のコラムでsubでsubstractを使用することができます

    Raw data Processed data 
23/11/2016 10:00 48.6  48.6 
23/11/2016 11:00 158.7  110.1 
23/11/2016 12:00 377.8  219.1 
23/11/2016 13:00 591.7  213.9 
23/11/2016 14:00 748.5  156.8 
23/11/2016 15:00 848.2  99.7 
+0

、あなたは毎日最初の値にリセットするには、「処理されたデータ」欄が必要ですかそれは一つの長い流れでなければなりませんか? – DSM

答えて

4

あなたが複数の列(ユニークそのものではありません)との場合を扱うことの利点を持っているパンダに joinでこれを行うことができます
df['Processed data'] = df['Raw data'].sub(df['Raw data'].shift()) 
df['Processed data'].iloc[0] = df['Raw data'].iloc[0] 
print (df) 
        Raw data Processed data 
2016-11-23 10:00:00  48.6   48.6 
2016-11-23 11:00:00  158.7   110.1 
2016-11-23 12:00:00  377.8   219.1 
2016-11-23 13:00:00  591.7   213.9 
2016-11-23 14:00:00  748.5   156.8 
2016-11-23 15:00:00  848.2   99.7 
+0

ありがとうございます。正確に私が必要としたもの。 – pottolom

0

あなたはfidは、その値がcumul_valueが変化する上で、別のパラメータを表し

 
timestep    fid  cumul_value 
2016-11-23 10:00:00  1   48.6 
2016-11-23 11:00:00  1   158.7 
2016-11-23 12:00:00  1   377.8 
2016-11-23 13:00:00  1   591.7 
2016-11-23 14:00:00  1   748.5 
2016-11-23 15:00:00  1   848.2 
2016-11-23 10:00:00  2   88.6 
2016-11-23 11:00:00  2   758.7 
... 
2016-11-23 12:00:00  5   577.8 
2016-11-23 13:00:00  5   691.7 
2016-11-23 14:00:00  5   348.5 
2016-11-23 15:00:00  5   148.2 

のようなデータフレームを持っていると仮定します。カラムをカラムcumul_valueから取得し、fidの場合はvalue(fid,timestep) = cumul_value(fid,timestep) - cumul_value(fid,timestep - 1)となるようにします。

onestep = timedelta(hours=1) 
df['prev_timestep'] = df['timestep'] - onestep 
df_cumul = df[['id','fid','timestep','cumul_value']] 
     .set_index(['timestep','fid']) 
df_val = df.join(df_cumul,on=['prev_timestep','fid'],rsuffix='_prev') 
df_val['value'] = df_val['cumul_value'] - df_val['cumul_value_prev'] 
df_val = df_val.drop(['prev_timestep','cumul_value_prev','cumul_value','id_prev'],axis=1) 

完了までの特殊なケースがそうである最初の時間ステップを処理することによって、(それt0を呼び出す)

df_t0 = df_cumul[df_cumul['timestep'] == t0] 
df_val.loc[df_val.index.isin(df_t0.index),'value'] = df_t0['cumul_value']