向前搜索时合并两个数据帧

Posted

技术标签:

【中文标题】向前搜索时合并两个数据帧【英文标题】:Merging two dataframes while seeking forward 【发布时间】:2021-11-15 01:46:05 【问题描述】:

我有两个 Pandas 数据帧,我需要合并它们以获取一组员工的完整历史记录。

两个框架都包含员工ID和数据有效时间的时间戳。但是一个表中的时间戳有时有点“晚”,这意味着第二个数据帧的时间戳是 on第一个数据帧中的时间戳。

示例数据

import pandas as pd

df = pd.DataFrame(
    'ID': [1000, 1000, 1002, 1003, 1004],
        'Start Date': [
            pd.Timestamp('2021-01-01'),
            pd.Timestamp('2021-01-01'),
            pd.Timestamp('2021-04-01'),
            pd.Timestamp('2021-01-01'),
            pd.Timestamp('2021-01-01')
    ],
        'Name': ['Joe', 'Bill', 'Bill', 'Martin', 'Jane']
    
)

df2 = pd.DataFrame(
    'ID': [1000, 1002, 1002, 1003, 1004],
        'Start Date': [
            pd.Timestamp('2021-01-01'),
            pd.Timestamp('2021-01-01'),
            pd.Timestamp('2021-04-05'),
            pd.Timestamp('2021-01-01'),
            pd.Timestamp('2021-01-10')
    ],
        'Position': ['Operator', 'Operator', 'Manager', 'Operator', 'Operator'])

df = df.merge(df2, how='left', on=['ID', 'Start Date'])
print(df)

输出

df

     ID Start Date    Name
0  1000 2021-01-01     Joe
1  1000 2021-01-01    Bill
2  1002 2021-04-01    Bill
3  1003 2021-01-01  Martin
4  1004 2021-01-01    Jane

df2

     ID Start Date  Position
0  1000 2021-01-01  Operator
1  1002 2021-01-01  Operator
2  1002 2021-04-05   Manager
3  1003 2021-01-01  Operator
4  1004 2021-01-10  Operator

合并的df

     ID Start Date    Name  Position
0  1000 2021-01-01     Joe  Operator
1  1000 2021-01-01    Bill  Operator
2  1002 2021-04-01    Bill       NaN
3  1003 2021-01-01  Martin  Operator
4  1004 2021-01-01    Jane       NaN

我想整理代码或修改数据,以便将一个数据框中的 bill 和 Jane 的数据与另一个数据框中的移位行合并。

我想过(但不知道怎么做)的一些解决方案是:

在第二个数据框中填充数据,以便所有行都显示在给定的日期范围内(例如,确保账单“经理”标题存在于 2021 年 1 月 2 日及以后的所有日期,等等所有 ID ) 将合并命令与允许在第二个数据帧中“向前搜索”直到找到匹配项的命令交换。

【问题讨论】:

如果可以的话,请就您的共享数据进一步分解您的解释。如果@BENY 的解决方案足够,您可以忽略此评论 【参考方案1】:

我不确定我和 BENY 的理解是一样的,我觉得每个 ID 只保留最新的更有意义?

(df.merge(df2, how='left', on='ID', suffixes=('_drop', ''))
   .loc[lambda d: ~d['ID'].duplicated(keep='last')]
   .drop('Start Date_drop', axis=1)
)

输出:

     ID    Name Start Date  Position
1  1000    Bill 2021-01-01  Operator
3  1002    Bill 2021-04-05   Manager
4  1003  Martin 2021-01-01  Operator
5  1004    Jane 2021-01-10  Operator

【讨论】:

是的,我没有说明我使用此方法的目的是从不同的数据集构建完整的员工历史记录,因此我确实希望保留所有行。但感谢您提供提示,以防不需要。

以上是关于向前搜索时合并两个数据帧的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:如何将两个不完整的数据帧合并或合并为一个完整的数据帧

使用完全外连接合并两个数据帧在两个数据帧上没有获得关键列

在 R 中合并多个数据帧时如何使用 suffixes 参数?

PySpark:如果一个条件从两个条件实现,则合并两个数据帧

基于部分startswith匹配合并两个数据帧

使用 pd.merge() 合并两个以上的数据帧