2017-06-28 44 views
2

我有一個數據幀,每個新行都有一個累計的統計數據。每天添加一個新行。現在我想迭代我的列,以便從上面的行中減去每行(從最後一行開始)。新的價值應該被放入一個新的專欄中。 這是我的數據框的外觀和在列「差異」的值是我想要的結果:從最後一行到第一行進行python熊貓數據幀的交織

 time  In  diff 
0 2017-06-26 7.086  
1 2017-06-27 8.086  1 
2 2017-06-28 10.200 2.114 

這是我想出了:

for x in df['In']: 
    df['diff'] = df.iloc[-1] - df.iloc[-2] 

但那不是它。我如何從最後一行開始循環,以及如何使iloc更具動態性?有人可以幫忙嗎? 謝謝!

回答

4

您可以使用Series.diff

df['diff'] = df['In'].diff() 
print (df) 
     time  In diff 
0 2017-06-26 7.086 NaN 
1 2017-06-27 8.086 1.000 
2 2017-06-28 10.200 2.114 
1

這可以通過使用shift()做到:

df 
     In  time 
0 7.086 2017-06-26 
1 8.086 2017-06-27 
2 10.200 2017-06-28 


df.sort_values('time', inplace=True) 

df['diff'] = df['In'] - df['In'].shift(1) 

df 
     In  time diff 
0 7.086 2017-06-26 NaN 
1 8.086 2017-06-27 1.000 
2 10.200 2017-06-28 2.114 
+0

像魔術一樣工作!謝謝 – Burray

3

使用pd.Series.diff

df.assign(Diff=df.In.diff()) 
+0

我不理解你的帖子。我認爲這裏缺少的是一個新的專欄。但是當我嘗試df ['diff'] = df.assign(Diff = df.In.diff())時,我得到一個ValueError:傳遞的項數錯誤11,放置隱含1 – Burray

+0

@Burray assign創建原始數據幀的副本一個新的專欄。使用:df = df.assign(Diff = df.In.diff()) – piRSquared

1

這裏是所有你需要做的。

df['diff'] = df.In - df.In.shift(1) 

# In [16]: df 
# Out[16]: 
#  time  In diff 
# 0 2017-06-26 7.086 NaN 
# 1 2017-06-27 8.086 1.000 
# 2 2017-06-28 10.200 2.114