繁体   English   中英

根据多个条件(包括日期范围)将结果从一个 dataframe 过滤到另一个 dataframe 的最快方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM