【问题标题】:Pandas: subtracting one cell value from column valuesPandas:从列值中减去一个单元格值
【发布时间】:2019-02-25 19:16:11
【问题描述】:

问这个问题是因为我的新单元格中填充了 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

正确的方法是什么?

【问题讨论】:

    标签: python pandas


    【解决方案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)
    

    【讨论】:

    • 我不知道为什么我们必须转换为int。在pd.Dataframe(),我们正在接受int。但是如果不转换它会给出str 错误,你能告诉我吗?
    • @Nihal - DataFrame 构造函数有问题,这里使用np.array,所以所有值都转换为字符串数组(因为NaN 字符串)。
    • @Nihal - 通过print (np.array([['onset', 100], ['NaN', 200], ['NaN', 350], ['NaN', 400]]))检查它
    • @Nihal 在创建时使用字典可以避免这样的问题。例如这个df = pd.DataFrame({'Event': ['onset', 'NaN', 'NaN', 'NaN'], 'Time': [100, 200, 350, 400]}) 不需要转换成int 类型。
    • @jezrael 你能帮忙解决这个问题吗stackoverflow.com/questions/54865312/…
    【解决方案2】:

    试试这个:

    onsettime = df.loc[df['Event']=='onset', 'Time']
    df['onsetlatency'] = df['Time'].apply(lambda x: float(x) - float(onsettime[0]))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 2020-01-25
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多