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

Python 使用数据帧下一行中的值,python,Python,我已在csv中以10分钟的分辨率为数据加上时间戳。每个时间戳都有一个1或0的“id”。我试图创建一个新列“time”,如果“id”=0,它将返回0,否则它将在下一行中返回“time”值加10。我可以在Excel上轻松地完成这项工作,我使用的公式如图所示 我正在尝试使用Python做同样的事情。在使用pandas将csv数据作为数据帧导入之后,我查看了和。我将“id”列复制到一个新列“time”,并使用了以下代码,但“time”的值保持完全相同(1或0) 基于第一个链接中的解决方案,我尝试将“1”

我已在csv中以10分钟的分辨率为数据加上时间戳。每个时间戳都有一个1或0的“id”。我试图创建一个新列“time”,如果“id”=0,它将返回0,否则它将在下一行中返回“time”值加10。我可以在Excel上轻松地完成这项工作,我使用的公式如图所示

我正在尝试使用Python做同样的事情。在使用pandas将csv数据作为数据帧导入之后,我查看了和。我将“id”列复制到一个新列“time”,并使用了以下代码,但“time”的值保持完全相同(1或0)

基于第一个链接中的解决方案,我尝试将“1”的值更改为null,并使用
if pd.isnull(e)
,但最终得到
TypeError:不支持的+操作数类型:'NoneType'和'int'

我再次尝试按相反顺序排列行,将
I+1
更改为
I-1
,但它也不起作用,我得到了
KeyError:-1

有人对我如何在Python中实现这一点有什么建议吗

编辑:

#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")
抱歉,我可能没有很好地解释我的问题。我已经想出了如何得到我想要的解决方案。我意识到问题是由于“id”和“time”的数据类型都是
object
KeyError:-1
问题是通过对行进行反向排序并在第一行的“time”不等于0时为其赋值来解决的。我将忽略“id”为0的第一行之前的任何一行,因此我使用999999

解决方案:

#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")

这应该可以做到,但您没有指定如何处理问题中出现的
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

如果要填充
NaN
值,只需在一行的末尾添加一个
fillna(0)

Hi-Dmitry。谢谢你的建议。抱歉,我认为我没有很好地解释我的问题,这并不是我想要的。然而,您的解决方案确实帮助我思考我的方法,并允许我提出一个解决方案,我已将其发布为编辑:)