如何根据日期时间约束从另一个数据框中提取行?

Posted

技术标签:

【中文标题】如何根据日期时间约束从另一个数据框中提取行?【英文标题】:How do I extract the rows from another dataframe based on a datetime constraint? 【发布时间】:2021-03-21 07:55:46 【问题描述】:

基本上我试图回答这个问题:“客户从 X 日期起最近的 4 个订单是什么......”但问题是我试图对按电子邮件日志排序的表中的每一行执行此操作并且有一个唯一的日期。

所以我必须查看这些电子邮件日志 (df1) 中的每个日期,找出 df1 中的 agent_id 是否与 agent_id df2(订单历史记录)匹配,然后从 df2 中提取最近的 4 个订单。 IE:客户端 123 在 3 月 3 日(df1)收到一封电子邮件......然后我需要在 df2 中提取客户端 123 的 4 个最新条目,这些条目等于或小于日期(3 月 3 日)。

我想出了这个杂乱无章的功能,但在循环超过 1000 行时它并不实用……有什么想法可以扩大它吗?

谢谢,

df1 = pd.DataFrame('unique_col': ['a', 'b', 'c', 'd'], 'agent_id': [1, 2, 3, 4], 'created_at_email': ['1/5/2020', '1/6/2020', '1/8/2020', '1/8/2020'])
df2 = pd.DataFrame('unique_col': ['a', 'b', 'c', 'd'], 'agent_id': [1, 1, 3, 1], 'created_at': ['1/4/2020', '1/5/2020', '1/6/2020', '1/9/2020'])

# note: super not optimized at all...
def function():
    for index, row in df1.iterrows():
        for index, row2 in df2.iterrows():
            if row['agent_id'] == row2['agent_id']:
                if row2['created_at'] <= row['created_at_email']:
                    print( 1, row2['created_at'], row['created_at_email'], row2['agent_id'], row['agent_id'], row['unique_col'], row2['unique_col'])
                else:
                    print( 0, row2['created_at'], row['created_at_email'], row2['agent_id'], row['agent_id'], row['unique_col'], row2['unique_col'])
            #else:
                #print( 0, row2['created_at'], row['created_at_email'], row2['agent_id'], row['agent_id'])
                    
                    
            
function()
output:
1 1/4/2020 1/5/2020 1 1 a a
1 1/5/2020 1/5/2020 1 1 a b
0 1/9/2020 1/5/2020 1 1 a d
1 1/6/2020 1/8/2020 3 3 c c 

【问题讨论】:

【参考方案1】:

首先,我们需要在df1df2 之间做一个对应来检索created_at_email

为此,您可以将两个数据帧索引设置为agent_id 列,之后我们可以连接两个数据帧

df1.index = df1.agent_id
df2.index = df2.agent_id
result = df2.join(df1,lsuffix='_df2')

join 方法基于索引的相等性匹配。

我们将重置result 的索引以防止groupby 期间出现错误并删除不必要的列

result.reset_index(drop=True,inplace=True)
result.drop(['agent_id_df2'],axis=1,inplace=True)

为了维护每个agent_id 的最新订单,我们将对created_atagent_id 上的数据框进行排序

result.sort_values(['agent_id','created_at'],inplace=True)

之后,您可以使用head 方法执行groupby 来检索每个代理最近的4 个订单

result = result.groupby('agent_id').head(4)

最终结果

unique_col_df2 created_at unique_col agent_id created_at_email
0 a 1/4/2020 a 1 1/5/2020
1 b 1/5/2020 a 1 1/5/2020
2 d 1/9/2020 a 1 1/5/2020
3 c 1/6/2020 c 3 1/8/2020

【讨论】:

您好,感谢您的回复!我想我应该指定...“所以我必须查看这些电子邮件日志 (df1) 中的每个日期,找出 df1 中的 agent_id 是否与 agent_id df2(订单历史记录)匹配,然后提取最新的来自 df2 的 4 个订单编辑:从 df1 中的日期开始。IE:因此,如果 df1 中的客户 123 在 3 月 3 日收到一封电子邮件。我需要查看订单日志(df2)并从中获取 4 个最新条目(行) df1 中的那个日期(3 月 3 日)。客户端 123 可以多次出现在 df1 中,唯一的分隔符是日期。谢谢!

以上是关于如何根据日期时间约束从另一个数据框中提取行?的主要内容,如果未能解决你的问题,请参考以下文章

如何从基于 sqlite 的日期约束中提取数据

如何从熊猫数据框中提取日期/年份/月份?

如何在 Pandas 数据框中按行值对日期时间列进行排序?

如何从包含文本的熊猫数据框中的列中提取年份(或日期时间)

按日期范围删除数据框中的行。

如何在从另一个表中提取数据时创建具有约束的表