【问题标题】:Merging two dataframes with a hint of common values合并两个带有共同值提示的数据框
【发布时间】:2021-09-24 06:41:01
【问题描述】:

我有兴趣合并具有以下属性的两个数据框:-

1.它们之间没有任何公共列,因此无法直接连接。

2。它们有不同的尺寸。例如 df2 有 4 行,df1 有 3 行。

3.两者的合并点是df2中的“ArrivalDateCap”和df1中的“ArrivalDateTime”相关的日期值。

数据框如下:

df1  = {'ID1': ['A12', 'A13', 'A14'], 'ArrivalDateTime': ["2021-09-20 16:37", "2021-09-21 03:10", "2021-09-26 03:10"]} 
df2  = {'ID': ['001', '002', '003','004'], 'ArrivalDateCap': ["2021-09-20 18:00", "2021-09-21 18:00", "2021-09-20 18:00","2021-09-25 16:00"]}  
  
df1 = pd.DataFrame(df1)  
df1["ArrivalDateTime"] = pd.to_datetime(df1["ArrivalDateTime"],format="%Y-%m-%d %H:%M") 

df2 = pd.DataFrame(df2)
df2["ArrivalDateCap"] = pd.to_datetime(df2["ArrivalDateCap"],format="%Y-%m-%d %H:%M") 

在上面的第 3 点之后,如果“ArrivalDateTime”列最接近且小于“ArrivalDateCap”值,则将其添加到 df2。例如,对于“ArrivalDateCap” - 2021-09-20 18:00:00,选择的“ArrivalDateTime”将为“2021-09-20 16:37:00”。因此,这个“ArrivalDateTime”小于“ArrivalDateCap”但最接近。 df3 的输出应该如下:-

df3  = {'ID': ['001', '002', '003','004'], 'ArrivalDateCap': ["2021-09-20 18:00", "2021-09-21 18:00", "2021-09-20 18:00","2021-09-25 16:00"],'ArrivalDateTime':['2021-09-20 16:37:00','2021-09-21 03:10:00','2021-09-20 16:37:00','2021-09-26 03:10:00'],'ID1':['A12','A13','A12','A14']}  
df3 = pd.DataFrame(df3)  

我认为比较“ArrivalDateCap”和“ArrivalDateTime”列,如果它们符合条件(小于和最接近),则将结果记录在另一个数据框中是有意义的。我该如何解决这个问题?提前谢谢你。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用pd.merge_asof 和direction='nearest' 来获得最接近的匹配项。

    df3 = pd.merge_asof(df2.sort_values('ArrivalDateCap'), 
                        df1.sort_values('ArrivalDateTime'),
                        left_on='ArrivalDateCap', right_on='ArrivalDateTime',
                        direction='nearest')
    

    输出:

    >>> df3
        ID      ArrivalDateCap  ID1     ArrivalDateTime
    0  001 2021-09-20 18:00:00  A12 2021-09-20 16:37:00
    1  003 2021-09-20 18:00:00  A12 2021-09-20 16:37:00
    2  002 2021-09-21 18:00:00  A13 2021-09-21 03:10:00
    3  004 2021-09-25 16:00:00  A13 2021-09-21 03:10:00
    

    【讨论】:

      猜你喜欢
      • 2021-12-17
      • 1970-01-01
      • 2021-12-18
      • 2020-10-27
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      相关资源
      最近更新 更多