在numpy / pandas中的vectorised list.get()解决方案

时间:2016-06-28 16:52:36

标签: python numpy pandas

我有一个临时KDF内核作为值的列表(或numpy数组),其中value index表示一周内相应的分钟。

我的数据是近似值,如下所述: - kde:浮点值的列表或ndarray,长度为7 * 24 * 60。 - df:具有约50列不同类型的DataFrame,包括timestamp列,其整数值在该范围内(0到7 * 24 * 60-1)。 Dataframe有大约2000000条记录。

作为样本:

col1|col2|...|col49|timestamp
1   | 2  |...| 49  |  15
2   | 3  |...| 50  |  16

我想要的输出应该是same dataframekd列,包括来自kde的相应值。换句话说,对于数据框中的每条记录,我需要使用记录时间戳获取KDE值。我需要尽快做到。

期望的结果:

col1|col2|...|col49|timestamp | kd
1   | 2  |...| 49  |  15      | 0.342
2   | 3  |...| 50  |  16      | 0.543

现在,我使用.apply():

df['kd'] = df.timestamp.apply(lambda z: kde[z])

然而,它的工作相对较慢,因为(据我所知),它仍受GIL限制。有没有办法对这个非常简单的函数进行矢量化?

2 个答案:

答案 0 :(得分:1)

我会做

import numpy as np
import pandas as pd

df['kd'] = np.array(kd)[df.timestamp.values]

答案 1 :(得分:0)

我可能使用的另一个解决方案是:

kdeDF = pf.DateFrame({'kd':kde}).reset_index()
kdeDF.columns = ['index', 'kd']
data1 = data.merge(kdeDF, how='left', left_on='timestamp', right_on='index')

但它看起来也很丑陋