Python 使用数据帧下一行中的值
我已在csv中以10分钟的分辨率为数据加上时间戳。每个时间戳都有一个1或0的“id”。我试图创建一个新列“time”,如果“id”=0,它将返回0,否则它将在下一行中返回“time”值加10。我可以在Excel上轻松地完成这项工作,我使用的公式如图所示 我正在尝试使用Python做同样的事情。在使用pandas将csv数据作为数据帧导入之后,我查看了和。我将“id”列复制到一个新列“time”,并使用了以下代码,但“time”的值保持完全相同(1或0) 基于第一个链接中的解决方案,我尝试将“1”的值更改为null,并使用Python 使用数据帧下一行中的值,python,Python,我已在csv中以10分钟的分辨率为数据加上时间戳。每个时间戳都有一个1或0的“id”。我试图创建一个新列“time”,如果“id”=0,它将返回0,否则它将在下一行中返回“time”值加10。我可以在Excel上轻松地完成这项工作,我使用的公式如图所示 我正在尝试使用Python做同样的事情。在使用pandas将csv数据作为数据帧导入之后,我查看了和。我将“id”列复制到一个新列“time”,并使用了以下代码,但“time”的值保持完全相同(1或0) 基于第一个链接中的解决方案,我尝试将“1”
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。谢谢你的建议。抱歉,我认为我没有很好地解释我的问题,这并不是我想要的。然而,您的解决方案确实帮助我思考我的方法,并允许我提出一个解决方案,我已将其发布为编辑:)