2016-07-18 7 views
0

の行のペアを処理するために、マップまたはapplymapまたは類似:ここ使用パンダは、私は、カウンタ間の違いに車の中でマイルをカウントするようなカウンタを処理しようとしているデータフレーム

が入力されている。

Index,    Counter 
2016-06-01 13:00:00,225907.9 
2016-06-01 14:00:00,225908.9 
2016-06-01 15:00:00,225909.9 
2016-06-01 16:00:00,225910.9 
2016-06-01 17:00:00,225911.9 
2016-06-01 18:00:00,225912.9 
2016-06-01 19:00:00,225913.9 

ここでは、所望の出力です:

Index,    Counter,Increase 
2016-06-01 13:00:00,225907.9,0.0 # by definition for the start of the df 
2016-06-01 14:00:00,225908.9,1.0 
2016-06-01 15:00:00,225909.9,1.0 
2016-06-01 16:00:00,225910.9,1.0 
2016-06-01 17:00:00,225910.9,0.0 
2016-06-01 18:00:00,225911.9,1.0 
2016-06-01 19:00:00,225912.9,1.0 

これは当然のループを、簡単です:(擬似コード:問題ワットから、これは迅速なコピーである&ペーストこれ以上の列)

for i in range(1,len(df)): 
    (previous, current)=df.loc[row:row+1, ['Counters'].values] 
    df.at[i, 'Increase'] = current[0] - previous[0] 

もちろん、私たちはループを使用しないことを好みます。私の質問は、applymapまたはmapまたはそれに類するもので、この計算を行うことができますか?ほとんどの場合、1行の値から1つの値を返すように見えます:2行から値を取り出し、1つの値を返すのはどうですか?

+0

あなたの所望の出力がために、入力と一致していませんがなぜ最初の行が0でなく、その後のすべての行が1.0ですか?とにかく 'df ['Increase'] = df ['Counter']を実行することができます。diff()' – EdChum

+0

Doh!それと同じくらい簡単です - 私は決して考えなかった.diff()ありがとう! – djnz0feh

+0

あなたはまだ期待された出力があなたの説明と異なる理由は説明していませんが、私の理解は最初の行では0、それ以外の行では1.0でなければなりません – EdChum

答えて

0

それはあなたがあなたの入力に基づいて、あなたの出力を得るかは不明だが、あなたはベクトル化され、大規模なデータセットのためにはるかに高速になりますdiff使用してこれを行うことができます。

In [15]: 
df['Increase'] = df['Counter'].diff().fillna(0) 
df 

Out[15]: 
       Index Counter Increase 
0 2016-06-01 13:00:00 225907.9  0.0 
1 2016-06-01 14:00:00 225908.9  1.0 
2 2016-06-01 15:00:00 225909.9  1.0 
3 2016-06-01 16:00:00 225910.9  1.0 
4 2016-06-01 17:00:00 225911.9  1.0 
5 2016-06-01 18:00:00 225912.9  1.0 
6 2016-06-01 19:00:00 225913.9  1.0 
関連する問題