[英]Fastest way to filter results from one dataframe into another dataframe based on multiple conditions (including date range)
这篇文章的目的:高性能过滤
我已经就这个问题进行了很多搜索,但我找到的帖子要么在较大的数据帧上表现不佳,要么没有解决我的确切问题。
问题:
我有以下数据框,其中每个客户上传所需文件(记录在 dataframe 1 中)并且客户购买产品(记录在 dataframe 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 中创建该列。
DataFrame 1:
文档类型 | 用户 | 日期_1 | 地位 |
---|---|---|---|
X | 123 | 2021-01-01 | 得到正式认可的 |
是 | 123 | 2021-01-01 | 得到正式认可的 |
X | 123 | 2022-02-03 | 谢绝 |
DataFrame 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 | 文档_x_状态 |
---|---|---|---|
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()
将字段转换为 arrays 并尝试以这种方式进行过滤。
所有的方法都花费了相当长的时间,而且由于数据的大小,这才开始成为一个问题。
感谢您的帮助。
您可以尝试使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.