首页 > 解决方案 > 如何使用 pandas itertuples 比较两个数据帧之间的行?

问题描述

我有两个带有日期范围和 ID 号的数据框。每个 ID 号在每个数据帧中出现多次。我的目标是,对于数据框 A 中的每一行,在数据框 B 中找到具有匹配 ID 号的每一行。对于每个匹配项,我需要检查数据框 A 中行的日期是否在数据框 B 中行的日期范围内。如果它在任何日期范围内,则需要对其进行标记。日期是 datetime64,ID 是 int64。我打算使用 itertuples。数据示例如下。谢谢!

数据框 A

|ID   |Visit date|Flag  |
|-----|----------|------|
|111  |jan 3 2020|      |
|222  |feb 3 2020|      |
|222  |mar 2 2020|      |
|333  |jan 3 2020|      |

数据框 B

|ID   |Start date |End date  |
|-----|-----------|----------|
|111  |feb 1 2020 |feb 5 2020|
|111  |mar 1 2020 |mar 5 2020|
|222  |feb 1 2020 |feb 5 2020|
|333  |jan 1 2020 |jan 5 2020|

目标:

|ID   |Visit date |Flag   |
|-----|-----------|-------|
|111  |jan 3 2020 | false |
|222  |feb 3 2020 | true  |
|222  |mar 2 2020 | false |
|333  |jan 3 2020 | true  |

标签: pythonpandasdataframe

解决方案


# merge dfa and dfb by "ID"
dfn = pd.merge(dfa, dfb, on='ID', how='left')
# covert to datetime Series
for col in dfn.columns:
    if 'date' in col:
        dfn[col] = pd.to_datetime(dfn[col])
# judge
dfn['Flag'] = dfn['Visit date'].between(dfn['Start date'], dfn['End date'])
dfn.sort_values('Flag', inplace=True)
# drop duplicates
dfn.drop_duplicates(['ID', 'Visit date'], keep='last').sort_index()

输出:

    ID Visit date   Flag Start date   End date
1  111 2020-01-03  False 2020-03-01 2020-03-05
2  222 2020-02-03   True 2020-02-01 2020-02-05
3  222 2020-03-02  False 2020-02-01 2020-02-05
4  333 2020-01-03   True 2020-01-01 2020-01-05
print(dfn)

    ID Visit date   Flag Start date   End date
0  111 2020-01-03  False 2020-02-01 2020-02-05
1  111 2020-01-03  False 2020-03-01 2020-03-05
3  222 2020-03-02  False 2020-02-01 2020-02-05
2  222 2020-02-03   True 2020-02-01 2020-02-05
4  333 2020-01-03   True 2020-01-01 2020-01-05

推荐阅读