我有一个大型数据集(以百万为单位的行数),我将其读入名为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).
添加回答
举报
0/150
提交
取消