为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUX布斯 2022-06-22 15:41:19
我有一个大型数据集(以百万为单位的行数),我将其读入名为datafile的 pandas DataFrame中。每行都有一个订单 ID 号 - 这不是唯一的。所以我的数据文件看起来像这样Price   Qty           OrderId26690  3000  121377226700  3000  121567326705  6000  121665626700  3000  121377226710  3000  1215673现在,我想要的是,对于每一行 - 获取 OrderID,在 DataFrame 中找到该 OrderID 的先前出现并获取相应的价格,并将其填充到新列“Prev_Price”中。如果没有找到以前的匹配项,则将值保持为 0。所以我的输出应该如下所示Price   Qty           OrderId  Prev_Price26690  3000  1213772 026700  3000  1215673 026705  6000  1216656 026700  3000  1213772 2669026710  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.valuesdatafile['Prev_Price'] = pd.Series(datafile.index).apply(getPrevPrice_np)但是对于我的要求来说它仍然很慢 - 实现这个的最快方法是什么?
查看完整描述

1 回答

?
达令说

TA贡献1821条经验 获得超6个赞

这更快:


datafile['Prev_Price'] = datafile.groupby('OrderId')['Price'].shift(fill_value=0)

它返回:


   Price   Qty  OrderId  Prev_Price

0  26690  3000  1213772           0

1  26700  3000  1215673           0

2  26705  6000  1216656           0

3  26700  3000  1213772       26690

4  26710  3000  1215673       26700

现在,在像您发布的那样的短数据帧上,这种方法实际上更慢。

但是我用更大的数据框做了几个测试:


在 100000(十万)行的数据帧上,它大约快 3 倍。

在 1000000(一百万)行的数据帧上,我的机器上仍然需要大约 1.5 秒,我没有测量你的方法的执行时间(花费太长时间,我终止了进程)。

注意: fill_value是pandas.DataFrame.shift自 pandas 0.24.0 以来的有效参数。对于旧版本,不要传递参数并NaN稍后使用datafile.fillna(0).


查看完整回答
反对 回复 2022-06-22
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号