【发布时间】:2021-01-08 07:26:45
【问题描述】:
我有一个数据集,其中包含事件数据,包括各种元素以及这些元素在不同时间点的位置数据。整个数据集非常庞大,涵盖了许多此类事件。
对于每个时间点的每个元素,我想找到最接近的其他元素。首先,我将返回一个包含所有其他元素在特定时间段内的位置数据的数组,并将其包含在原始数据帧的同一行中(以便稍后执行进一步的计算)。
我有两次尝试对此进行编码,我已将其包括在下面。在如此庞大的数据集上,两者都花费了太长时间。任何能让我提高效率的方法都将不胜感激。
import pandas as pd
import numpy as np
def func1(db, val, frame):
return db.loc[(db['val'].isin([val])) & (db['frameId'].isin([frame])) & ['displayName', 'x', 'y']]
.reset_index(drop=True).values.tolist()
d = pd.DataFrame({'displayName': ['Bob', 'Jane', 'Alice',
'Bob', 'Jane', 'Alice'],
'x': [90, 88, 86, 94, 91, 92],
'y': [24, 13, 18, 20, 15, 16],
'val': [201801, 201801, 201801, 201801, 201801, 201801],
'frameId': [1, 1, 1, 2, 2, 2]})
res = d.apply(lambda row: func1(d, row['val'], row['frameId']), axis=1)
方法二:
def func2(db, val, frame):
return [l[[0, 1, 2]] for l in db if l[3] == val if l[4] == frame]
res = d.apply(lambda row: func2(np.array(d), row['val'], row['frameId']), axis=1)
因此,结果 (res) 将是一个如下所示的数组:
[[['Bob', 90, 24], ['Jane', 88, 13], ['Alice', 86, 18]],
[['Bob', 90, 24], ['Jane', 88, 13], ['Alice', 86, 18]],
[['Bob', 90, 24], ['Jane', 88, 13], ['Alice', 86, 18]],
[['Bob', 94, 20], ['Jane', 91, 15], ['Alice', 92, 16]],
[['Bob', 94, 20], ['Jane', 91, 15], ['Alice', 92, 16]],
[['Bob', 94, 20], ['Jane', 91, 15], ['Alice', 92, 16]]]
但是在大型数据集上,这两种方法都非常耗时,因此欢迎任何降低时间复杂度的方法。
【问题讨论】:
-
请在此处查看如何创建
pandas最小可重现示例:stackoverflow.com/questions/20109391/…。您需要输入数据和输出数据(无图像)。输入数据可以只是问题的一个小样本数据集。 -
谢谢你。现在已经更新了原来的问题。
-
现在几乎包含了您的预期输出,因此回答者可以知道他们是否提供了正确的解决方案。
-
好的,又更新了。
标签: pandas numpy optimization coding-efficiency