熊猫:从列值中减去一个像元值​​

时间:2019-02-25 11:00:33

标签: python pandas

问这个问题,因为我的新单元格中装有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

正确的方法是什么?

2 个答案:

答案 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]))