根据另一列中的数值查找某一列中的数值

3
假设该值存在,我如何在数据框中创建另一列“testFinal”,其中将包含 df["test"] 和 "df["test"] 0.2秒后" 的绝对值之差,例如,testFinal 的第一个值是 2 和 0.2 秒后的值之间差的绝对值 -> 因此为 8,结果为 abs(2-8) = 6。我的目标是计算“testFinal”。我不知道是否清晰,所以这里有个例子。

enter image description here

注意:时间戳不是均匀的,因此两个值之间的间隔可能随时间而异。

非常感谢

以下是数据框的代码

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]})

当然,我进行了一些编辑。 - The L
1
如果0.2秒后的值不存在,testFinal应该是什么? - timgeb
我假设这个值存在(实际上,我进行了一些计算以确保会有一个值)。 - The L
唯一需要注意的是时间戳不是同质的,因此它可能是0.1、0.2、0.3、0.31、0.32、0.33、0.4、0.5等。 - The L
我认为是这样,但我不确定这是否是一个好主意,不过我通常使用round()来解决这个问题。 - The L
显示剩余2条评论
2个回答

2
首先,创建一个新的临时列temp,通过使用pd.to_timedeltaTimestamp列转换为timedelta来获取该列,然后将此temp列设置为数据框的index,接着创建一个新列testFinal,其值为这个新索引+0.2秒,然后使用Series.map,将testFinal列映射到df['test']列的值,因此现在testFinal列应该有与test列中的值相对应的值0.2秒之后,然后您可以从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

非常感谢,你能解释一下你做了什么吗? - The L
我在其他话题中搜索过,但没有找到关于map()方法的应用程序,您能否解释一下? - The L
@Lukx 参考这篇文章,它详细解释了map的用法。 - Shubham Sharma
@Lukx map 如其名,将一个序列中的值映射到另一个序列中的值,即“一对一对应”。 - Shubham Sharma
好的,谢谢。如果我理解正确的话,您将“testFinal”的值替换为“test”中的值,根据索引(如果您不使用字典映射,则会使用索引进行映射,是吗?)。 - The L
1
@Lukx 是的,完全正确,这就是为什么我们首先设置索引的原因。 - Shubham Sharma

0
您可以按照以下方式使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接