使用数据帧的下一行中的值

时间:2017-06-19 11:06:10

标签: python

我在csv中为数据加上时间戳,分辨率为10分钟as shown in this image。每个时间戳都有一个" id"这是1或0.我正在尝试创建一个新列," time",如果" id"则返回0 = 0,否则它应该返回" time"的值在下一行加上10.我可以在Excel上轻松完成,我使用的公式显示在图像中。

我正在尝试使用Python来做同样的事情。使用pandas将csv数据导入为数据框后,我查看了this linkthis link。我复制了" id"列到新列,"时间"并使用以下代码,但" time"的值保持完全相同(1或0)。

for i, e in enumerate(df['time']):
    if e==1:
        df.at[i,'time']=df.at[i+1,'time']+10

根据第一个链接中的解决方案,我尝试更改' 1'使用if pd.isnull(e)并使用TypeError: unsupported operand type(s) for +: 'NoneType' and 'int',但最终得到i+1

我通过反向排序行再次尝试了它,将i-1更改为KeyError: -1但它也没有工作,我得到了object

有没有人对如何在Python中执行此操作有任何建议?

修改

道歉,我可能没有很好地解释我的问题。我已经想出如何获得我想要的解决方案。我意识到问题是由于" id"的dtypes和"时间"都是KeyError: -1。通过反向排序行并为" time"分配值来解决#sort timestamp in reverse df=df.sort_values(by="timestamp",ascending=False) #change dtype object to int64 df['id']=df['id'].astype(np.int64) df['time']=df['id'] #assigning value to "time" in first row if df.loc[0,'time']==0: df.set_value(0,'time',0) else: df.set_value(0,'time',999999) #using the previous row's value to evaluate "time" for i, e in enumerate(df['time']): if e==1: df.at[i,'time']=df.at[i-1,'time']+10 #sort timestamp back in ascending order df=df.sort_values(by="timestamp") 问题。如果它不等于0,则在第一行中。我将忽略第一行之前的任何行" id"为0,所以我使用了999999。

解决方案:

$('p').filter(function() {

  var nodetoCheck = $(this).contents()[0];
  if ($(this).contents()[0].nodeValue.trim() === '') {
    nodetoCheck = $(this).contents()[1];
  }

  if (nodetoCheck.nodeType === 1) {
    return true;
  }
}).addClass('selected');

1 个答案:

答案 0 :(得分:0)

这应该可以解决问题,但您没有说明如何处理将在您的问题中出现的NaN

import pandas as pd

df = pd.DataFrame({'id':[1,1,0,0,1,0,1], 'nums':[10,20,50,10,10,30,20]})


   id  nums
0   1    10
1   1    20
2   0    50
3   0    10
4   1    10
5   0    30
6   1    20


df['nums'] = pd.concat([df, df['nums'].shift(-1)], axis=1).apply(lambda x: 0 if x['id'] == 0 else x[[2]]+10, axis=1)

   id  nums
0   1  30.0
1   1  60.0
2   0   0.0
3   0   0.0
4   1  40.0
5   0   0.0
6   1   NaN

如果您想填充fillna(0)值,可以在单行的末尾添加NaN