有没有办法合并间隔索引和 pandas 中的另一个列值?

Is there a way to merge on Interval Index and another Column Value in pandas?

所以我目前有 2 个数据帧。它们有不同的列,我一直想弄清楚的是如何合并间隔索引和唯一 ID 值。以下是我拥有的数据帧的 2 个不同示例:

UniqueID,Start_Date,End_Date
ID1,01-01-2020,01-08-2020
ID2,01-02-2020,01-04-2020
ID3,01-03-2020,01-05-2020
ID4,01-04-2020,01-09-2020
ID5,01-05-2020,01-10-2020
ID6,01-06-2020,01-11-2020

正在创建数据框:

pd.DataFrame({
    'UniqueId': ['ID1','ID2','ID3','ID4','ID5','ID6'],
    'Start_Date': ['01-01-2020','01-02-2020','01-03-2020','01-04-2020','01-05-2020','01-06-2020'],
    'End_Date': ['01-08-2020','01-04-2020','01-05-2020','01-09-2020','01-10-2020','01-11-2020']
})

UniqueID,Trip_Date,Value
ID1,10-02-2020,1
ID1,15-02-2020,207
ID2,06-03-2020,10
ID3,29-01-2022,15
ID9,15-02-2020,207
ID12,19-06-2021,189

正在创建数据框:

pd.DataFrame({
    'UniqueId': ['ID1','ID1','ID2','ID3','ID9','ID12'],
    'Trip_Date': ['10-02-2020','15-02-2020','06-03-2020','29-01-2022','15-02-2020','19-06-2021'],
    'Value': ['1','207','10','15','207','189']
})

我想做的是能够在UniqueID 以及开始日期和结束日期的间隔上进行合并。生成的数据框如下所示:

UniqueID,Start_Date,End_Date,Trip_Date,Value
ID1,01-01-2020,01-08-2020,10-02-2020,1
ID1,01-01-2020,01-08-2020,15-02-2020,207
ID2,01-02-2020,01-04-2020,06-03-2020,10
ID3,01-03-2020,01-05-2020,NA,NA
ID4,01-04-2020,01-09-2020,NA,NA
ID5,01-05-2020,01-10-2020,NA,NA
ID6,01-06-2020,01-11-2020,NA,NA

df2.merge(df1, how='left', on='UniqueID')

我想到的第一种方法是在 df1 上使用 IntervalIndex,然后基于它进行合并,但是我遇到了无法在 UniqueID 上合并的问题,反之亦然,UniqueID 作为合并列.当我将 df2 与 df1 合并时,我保留了左连接,以便在将 df1 的任何记录与 df2 上的潜在“匹配项”合并时保留原始数据帧。

我考虑过可能使用带有 IntervalIndex 的 MultiIndex 作为其中一个级别,然后使用 UniqueID 作为另一个级别,但不确定如何去做?任何想法将不胜感激!

下面的代码应该允许您将数据帧放入 pandas df。只需确保复制并重新分配即可。

df = pd.read_clipboard(sep=',')
df1 = df.copy()

您可以合并两列上的数据框。因此,如果您计算每个数据帧中的间隔,则可以匹配 'UniqueID' 和 'Interval'。例如,参见 post: .

import pandas as pd

df1 = pd.read_csv("df1.csv")
df2 = pd.read_csv("df2.csv")
new_df = pd.merge(df1, df2,  how='left',)
print(new_df)

合并 UniqueID 列中的数据框,然后检查 Trip_Date 是否介于 Start_DateEnd_date 之间。最后设置为nan所有不满足条件的行:

# Only if this columns have not datetime64 dtype
df1['Start_Date'] = pd.to_datetime(df1['Start_Date'], dayfirst=True)
df1['End_Date'] = pd.to_datetime(df1['End_Date'], dayfirst=True)
df2['Trip_Date'] = pd.to_datetime(df2['Trip_Date'], dayfirst=True)

out = pd.merge(df1, df2, on='UniqueID', how='left')
m = out['Trip_Date'].between(out['Start_Date'], out['End_Date'])

out.loc[~m, ['Trip_Date', 'Value']] = np.NaN

输出:

>>> out
  UniqueID Start_Date   End_Date  Trip_Date  Value
0      ID1 2020-01-01 2020-08-01 2020-02-10    1.0
1      ID1 2020-01-01 2020-08-01 2020-02-15  207.0
2      ID2 2020-02-01 2020-04-01 2020-03-06   10.0
3      ID3 2020-03-01 2020-05-01        NaT    NaN
4      ID4 2020-04-01 2020-09-01        NaT    NaN
5      ID5 2020-05-01 2020-10-01        NaT    NaN
6      ID6 2020-06-01 2020-11-01        NaT    NaN