猿问

在 pandas Dataframe 或 numpy 数组中查找值的先前实例的快速方法?

我有一个大型数据集(以百万为单位的行数),我将其读入名为datafile的 pandas DataFrame中。


每行都有一个订单 ID 号 - 这不是唯一的。所以我的数据文件看起来像这样


Price   Qty           OrderId


26690  3000  1213772


26700  3000  1215673


26705  6000  1216656


26700  3000  1213772


26710  3000  1215673

现在,我想要的是,对于每一行 - 获取 OrderID,在 DataFrame 中找到该 OrderID 的先前出现并获取相应的价格,并将其填充到新列“Prev_Price”中。如果没有找到以前的匹配项,则将值保持为 0。所以我的输出应该如下所示


Price   Qty           OrderId  Prev_Price


26690  3000  1213772 0


26700  3000  1215673 0


26705  6000  1216656 0


26700  3000  1213772 26690


26710  3000  1215673 26700

我尝试使用 numpy 并编写了这个函数


def getPrevPrice_np(x):

    try:

        return list(datanp[np.where(datanp[0:x,2]==datanp[x,2])][:,0])[-1]

    except:

        return 0

我这样申请


datanp = datafile.values

datafile['Prev_Price'] = pd.Series(datafile.index).apply(getPrevPrice_np)

但是对于我的要求来说它仍然很慢 - 实现这个的最快方法是什么?


HUX布斯
浏览 104回答 1
1回答

达令说

这更快:datafile['Prev_Price'] = datafile.groupby('OrderId')['Price'].shift(fill_value=0)它返回:   Price   Qty  OrderId  Prev_Price0  26690  3000  1213772           01  26700  3000  1215673           02  26705  6000  1216656           03  26700  3000  1213772       266904  26710  3000  1215673       26700现在,在像您发布的那样的短数据帧上,这种方法实际上更慢。但是我用更大的数据框做了几个测试:在 100000(十万)行的数据帧上,它大约快 3 倍。在 1000000(一百万)行的数据帧上,我的机器上仍然需要大约 1.5 秒,我没有测量你的方法的执行时间(花费太长时间,我终止了进程)。注意: fill_value是pandas.DataFrame.shift自 pandas 0.24.0 以来的有效参数。对于旧版本,不要传递参数并NaN稍后使用datafile.fillna(0).
随时随地看视频慕课网APP

相关分类

Python
我要回答