在特定条件下合并重复键的pandas数据框
正如标题所说,我想把两个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
- 用
how='left'
的方式合并数据表; - 只保留
User
和Action date
的值,前提是Action Date >= Fact Date
; - 在排序后去掉重复的记录,以保留最新的
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 == Depression
且 Fact 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 == Depression
且 Fact 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