亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號