【问题标题】:Find a value in a column in function of another column在另一列的函数中查找列中的值
【发布时间】:2020-06-30 15:51:11
【问题描述】:

假设该值存在,例如,我该如何在数据框中创建另一列“testFinal”,其中我将获得 df["test"]-" df["test"] 的绝对值,即 0.2 秒后 ” 例如testFinal的第一个值是2和0.2秒后的值之差的绝对值->所以8,结果是abs(2-8) = 6

我的目标是计算“testFinal”

我不知道它是否清楚所以这里是示例

注意:时间戳不是同质的,因此两个值之间的间隔可能会随着时间的推移而不同

非常感谢

这是数据框的代码

df = pd.DataFrame({'Timestamp':[11.1,11.2,11.3,11.4,11.5,11.6,11.7,11.8,11.9,12.0,12.10],
                   'test':[2,22,8,4,5,4,5,3,54,23,89],
                   'testFinal':[6,18,3,0,0,1,49,20,35,np.NaN,np.NaN]})

【问题讨论】:

  • 我认为你应该更好地解释一下你到底想在 testFinal 中拥有什么。我很迷茫。例如,如何计算第一行。
  • 当然,我做了一些修改
  • 如果0.2s后的值不存在,testFinal应该是什么?
  • 我假设这个值是存在的(事实上我问的事情是我做了一些计算以确保会有一个值)
  • 唯一需要注意的是时间戳不是同质的,所以它可能是 0.1 0.2 0.3 0. 31 0.32 0.33 0.4 0.5 ...

标签: python pandas numpy dataframe


【解决方案1】:

首先,创建一个新的临时列temp,使用pd.to_timedeltaTimestamp列转换为timedelta,然后将此temp列设置为数据框index,然后创建一个新列@987654330 @ 将值作为这个新索引 + 0.2 seconds,然后使用 Series.map,将 testFinal 列映射到来自 df['test'] 列的值,因此现在 testFinal 列应该具有与 @ 中的值对应的值987654336@ 列0.2s 稍后,您可以减去testFinaltest 列中的值以获得所需的结果:

df['temp'] = pd.to_timedelta(df['Timestamp'], unit='s')
df = df.set_index('temp')

df['testFinal'] = df.index + pd.Timedelta(seconds=0.2)
df['testFinal'] = df['testFinal'].map(df['test']).sub(df['test']).abs()

df = df.reset_index(drop=True)

# print(df)
    Timestamp  test  testFinal
0        11.1     2        6.0
1        11.2    22       18.0
2        11.3     8        3.0
3        11.4     4        0.0
4        11.5     5        0.0
5        11.6     4        1.0
6        11.7     5       49.0
7        11.8     3       20.0
8        11.9    54       35.0
9        12.0    23        NaN
10       12.1    89        NaN

【讨论】:

  • 非常感谢,你能解释一下你做了什么吗?
  • 我搜索了一些其他主题,但我没有找到 map() 方法的这个应用程序,请你解释一下吗?
  • @Lukx 参考这个article 它详细解释了map
  • @Lukx map 顾名思义将一个系列中的值映射到另一个系列中的值,即one to one correspondence
  • @Lukx 是的,绝对正确,这就是我们首先设置索引的原因。
【解决方案2】:

您可以使用numpy,如下所示。我创建了一个新列 test_final 与预期的 testFinal 列进行比较。

import numpy as np

test = df.test.values
df['test_final'] = np.abs(test - np.concatenate((test[2:], np.array([np.nan]*2)), axis=0))
print(df)

输出

    Timestamp  test  testFinal  test_final
0        11.1     2        6.0         6.0
1        11.2    22       18.0        18.0
2        11.3     8        3.0         3.0
3        11.4     4        0.0         0.0
4        11.5     5        0.0         0.0
5        11.6     4        1.0         1.0
6        11.7     5       49.0        49.0
7        11.8     3       20.0        20.0
8        11.9    54       35.0        35.0
9        12.0    23        NaN         NaN
10       12.1    89        NaN         NaN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多