2017-06-28 46 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