问这个问题,因为我的新单元格中装有NaN,而我在这里找不到所需的答案。
说我有以下数据框(这是较大的拼接数据框的虚拟子集:
pd.DataFrame(np.array([['onset', 100], ['NaN', 200], ['NaN', 350], ['NaN', 400]]), columns=['Event', 'Time'])
如此:
Event Time
0 onset 100
1 NaN 200
2 NaN 350
3 NaN 400
我想创建一个具有相对时间戳的列,例如:
Event Time reltime
0 onset 100 0
1 NaN 200 100
2 NaN 350 250
3 NaN 400 300
我将如何处理?我以为可以在loc
处找到时间,并像这样从列中减去该值:
onsettime = df.loc[df['Event']=='onset', 'Time']
df['onsetlatency'] = df['Time']-onsettime
有关信息:
[In] print onsettime
[Out] 0 100
Name: Time, dtype: int64
但是,即使两个值均为int64,它也仅适用于第一行。 (如下所示)
Event Time reltime
0 onset 100 0.0
1 NaN 200 NaN
2 NaN 350 NaN
3 NaN 400 NaN
正确的方法是什么?
答案 0 :(得分:1)
如果值onset
始终存在,则通过索引获得第一个值:
df['Time'] = df['Time'].astype(int)
onsettime = df.loc[df['Event']=='onset', 'Time'].values[0]
df['onsetlatency'] = df['Time'] - onsettime
print (df)
Event Time onsetlatency
0 onset 100 0
1 NaN 200 100
2 NaN 350 250
3 NaN 400 300
更通用的解决方案-如果值onset
不存在,请获取0
:
onsettime = df.loc[df['Event']=='onset', 'Time']
df['onsetlatency'] = df['Time'] - next(iter(onsettime), 0)
答案 1 :(得分:0)
尝试一下:
onsettime = df.loc[df['Event']=='onset', 'Time']
df['onsetlatency'] = df['Time'].apply(lambda x: float(x) - float(onsettime[0]))