0

我有两个数据框。第一个包含一系列带有两个日期的 ID 号,第二个包含一系列带有事件日期的 ID 号。

import pandas as pd
df1 = pd.DataFrame({'id': ['19403', '59208', '45290'], 'date_1': ['2021-01-04', '2021-01-05', '2021-05-08'], 'date_2': ['2021-03-07', '2021-01-12', '2021-06-15']})
df2 = pd.DataFrame({'id': ['19403', '19403', '19403', '59208', '59208', '45290', '45290', '45290', '45290', '45290', '45290', '45290'], 'date': ['2021-01-05', '2021-02-12', '2021-03-17', '2021-01-06', '2021-01-08', '2021-03-14', '2021-03-17', '2021-05-09', '2021-05-12', '2021-05-23', '2021-06-01', '2021-08-14' ]})

我正在尝试合并两个数据帧,以便对于第一个数据帧中的每一行,它计算第二个事件的数量,其中日期在第一个数据帧的两个日期之间并且 ID 号匹配。

output = pd.DataFrame({'id': ['19403', '59208', '45290'], 'date_1': ['2021-01-04', '2021-01-05', '2021-05-08'], 'date_2': ['2021-03-07', '2021-01-12', '2021-06-15'], 'count': [2, 2, 4]})

我已经能够一次模拟一行(如下),但我正在努力将它应用于整个数据框。

count = df2[(df2['id'] == '19403') & (df2['date'].between('2021-01-04', '2021-03-07'))]['date'].count()

有什么建议么?我可能在这里遗漏了一些明显的东西。

4

1 回答 1

1
(df1.merge(df2, on='id', how='outer')
    .query("(date_1 <= date <= date_2)")
    .groupby(['id', 'date_1', 'date_2'], as_index=False)
    .size())

输出:

    id      date_1      date_2    size
0   19403   2021-01-04  2021-03-07  2
1   45290   2021-05-08  2021-06-15  4
2   59208   2021-01-05  2021-01-12  2
于 2021-10-28T16:31:54.157 回答