在特定条件下合并重复键的pandas数据框

0 投票
1 回答
37 浏览
提问于 2025-04-13 15:01

正如标题所说,我想把两个Pandas数据集结合起来,这两个数据集都有重复的键,同时还要考虑其他列的某些条件(在这个例子中是日期列)。我有这两个数据集:

数据集A:

ID 事实 级别 事实日期
1 酗酒 专家 2024-01-23
1 焦虑症 专家 2024-01-23
1 抑郁症 顾问 2024-02-15

数据集B:

ID 用户 行动日期
1 AA 2024-01-23
1 BB 2024-02-17

我想把它们合并成这样:

合并后的数据集AB:

ID 事实 级别 事实日期 用户 行动日期
1 酗酒 专家 2024-01-23 AA 2024-01-23
1 焦虑症 专家 2024-01-23 AA 2024-01-23
1 抑郁症 顾问 2024-02-15 BB 2024-02-17

我想合并那些事实日期不晚于行动日期的行。但是你可以看到,在合并后的数据库的第三行,它会选择最接近的事实日期的数据(所以选择了BB,而不是AA,尽管1月23日早于2月17日)。

如果抑郁症的事实日期是2月18日(晚于2月17日),那么通过左连接,它会在第三行返回空信息。

如果抑郁症的事实日期是2月18日,合并后的数据集AB将是:

ID 事实 级别 事实日期 用户 行动日期
1 酗酒 专家 2024-01-23 AA 2024-01-23
1 焦虑症 专家 2024-01-23 AA 2024-01-23
1 抑郁症 顾问 2024-02-18

任何帮助都非常感谢!

1 个回答

1
  1. how='left' 的方式合并数据表;
  2. 只保留 UserAction date 的值,前提是 Action Date >= Fact Date
  3. 在排序后去掉重复的记录,以保留最新的 Action date
df = pd.merge(df1, df2, on=["ID"], how="left")
df[["Action date", "User"]] = df.loc[
    df["Action date"] >= df["Fact date"], ["Action date", "User"]
]
df = df.sort_values("Action date").drop_duplicates(["ID", "Fact", "Level", "Fact date"])

Fact == DepressionFact Date == 2024-02-15 时:

   ID              Fact       Level  Fact date User Action date
0   1     Alcohol abuse  Specialist 2024-01-23   AA  2024-01-23
2   1  Anxiety disorder  Specialist 2024-01-23   AA  2024-01-23
5   1        Depression     Advisor 2024-02-15   BB  2024-02-17

Fact == DepressionFact Date == 2024-02-18 时:

   ID              Fact       Level  Fact date User Action date
0   1     Alcohol abuse  Specialist 2024-01-23   AA  2024-01-23
2   1  Anxiety disorder  Specialist 2024-01-23   AA  2024-01-23
4   1        Depression     Advisor 2024-02-18  NaN         NaT

撰写回答