Python 熊猫:从列值中减去一个单元格值
问这个问题是因为我的新牢房里都是NaN的,我在这里找不到我需要的答案 假设我有以下数据帧(这是较大拼接数据帧的虚拟子集):Python 熊猫:从列值中减去一个单元格值,python,pandas,Python,Pandas,问这个问题是因为我的新牢房里都是NaN的,我在这里找不到我需要的答案 假设我有以下数据帧(这是较大拼接数据帧的虚拟子集): pd.DataFrame(np.array([['onset', 100], ['NaN', 200], ['NaN', 350], ['NaN', 400]]), columns=['Event', 'Time']) 因此: 我想创建一个具有相对时间戳的列,如: Event Time reltime 0 onset 100 0 1
pd.DataFrame(np.array([['onset', 100], ['NaN', 200], ['NaN', 350], ['NaN', 400]]), columns=['Event', 'Time'])
因此:
我想创建一个具有相对时间戳的列,如:
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。(如下所示)
正确的方法是什么?如果始终存在值
开始
请通过索引查看LCT第一个值:
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
更一般的解决方案-如果值start
不存在,则获取0
:
onsettime = df.loc[df['Event']=='onset', 'Time']
df['onsetlatency'] = df['Time'] - next(iter(onsettime), 0)
试试这个:
onsettime = df.loc[df['Event']=='onset', 'Time']
df['onsetlatency'] = df['Time'].apply(lambda x: float(x) - float(onsettime[0]))
我不知道为什么我们必须转换成
int
。在pd.Dataframe()
中,我们使用int
。但是如果不转换它,就会产生str
错误,你能告诉我吗?@Nihal-这是Dataframe
构造函数的问题,这里是usenp.array
,所以所有的值都被转换成字符串数组(因为NaN
string)。@Nihal-通过print(np.array([['start',100],'NaN',200],'NaN',350],'NaN',400]])检查它。
@Nihal在创建时可以通过使用字典避免这样的问题。例如,这个df=pd.DataFrame({'Event':['start',NaN',NaN NaN',NaN 200',NaN',NaN',400],'Time':[100,200,350,400]})
不需要转换成int
类型。@jezrael你能帮我回答这个问题吗
onsettime = df.loc[df['Event']=='onset', 'Time']
df['onsetlatency'] = df['Time'] - next(iter(onsettime), 0)
onsettime = df.loc[df['Event']=='onset', 'Time']
df['onsetlatency'] = df['Time'].apply(lambda x: float(x) - float(onsettime[0]))