向前搜索时合并两个数据帧
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 参数?