這篇文章的目的:高性能過濾
我已經對這個問題進行了很多搜索,但是我找到的帖子要么在較大的資料幀上沒有性能,要么不能解決我的確切問題。
問題:
我有以下資料框,每個客戶上傳所需的檔案(記錄在資料框 1 中)并且客戶購買產品(記錄在資料框 2 中)。
用外行的話來說,在客戶購買產品時,我們正在嘗試檢索他應該上傳的特定檔案的最新狀態。如果客戶尚未上傳檔案,則結果應為無。
以下三個過濾條件是每行 dataframe_2 應應用的條件:
df_1.user == df_2.user
df_1.type == x
df_1.date_1 <= df_2.date_2
#e.g date_1 from dataframe_1 is the MAXIMUM date possible <= date_2 in dataframe_2).
一旦我過濾了上述這些條件,我們想要檢索檔案的狀態(或者如果它不存在,則為 None)并在 dataframe_2 中創建該列。
資料框 1:
| 檔案型別 | 用戶 | 日期_1 | 地位 |
|---|---|---|---|
| X | 123 | 2021-01-01 | 得到正式認可的 |
| 是的 | 123 | 2021-01-01 | 得到正式認可的 |
| X | 123 | 2022-02-03 | 拒絕 |
資料框 2:
| ID | 用戶 | 日期_2 |
|---|---|---|
| 1 | 123 | 2021-01-01 |
| 2 | 123 | 2021-01-01 |
| 3 | 123 | 2021-05-04 |
| 4 | 123 | 2022-02-05 |
| 5 | 456 | 2021-07-30 |
結果:
| ID | 用戶 | 日期_2 | document_x_status |
|---|---|---|---|
| 1 | 123 | 2021-01-01 | 得到正式認可的 |
| 2 | 123 | 2021-01-01 | 得到正式認可的 |
| 3 | 123 | 2021-05-04 | 得到正式認可的 |
| 4 | 123 | 2022-02-05 | 拒絕 |
| 5 | 456 | 2021-07-30 | 沒有任何 |
我已經嘗試了許多方法,從多索引過濾到使用to_numpy()并嘗試以這種方式過濾將欄位轉換為陣列。
所有方法都花費了相當長的時間,并且由于資料的大小,這才開始成為一個問題。
感謝您的所有幫助。
uj5u.com熱心網友回復:
您可以嘗試使用pd.merge_asof日期作為索引:
import pandas as pd
# Use sort_index if the dates are not already sorted (required for merge_asof).
df1 = df1[df1['document_type'].eq('x')].set_index('date_1').sort_index()
df2 = df2.set_index('date_2').sort_index()
res = (pd.merge_asof(df2, df1, by='user', left_index=True, right_index=True, direction='backward').
drop(columns=['document_type']).fillna('None').reset_index()
)
print(res)
date_2 index id user status
0 2021-01-01 0 1 123 approved
1 2021-01-01 1 2 123 approved
2 2021-05-04 2 3 123 approved
3 2021-07-30 4 5 456 None
4 2022-02-05 3 4 123 declined
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/479722.html
