我有一個大型數據集(以百萬為單位的行數),我將其讀入名為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
提交
取消