【问题标题】:Merging Dataframe with Different Dates?合并具有不同日期的数据框?
【发布时间】:2019-05-23 22:54:48
【问题描述】:

我想将一个单独的数据框 (df2) 与主数据框 (df1) 合并,但如果对于给定的行,df1 中的日期在 df2 中不存在,则在基础日期之前搜索最近的日期df1.

我尝试使用 pd.merge,但它会删除日期不匹配的行,并且只保留两个 df 中匹配的行。

df1 = [['2007-01-01','A'],
       ['2007-01-02','B'],
       ['2007-01-03','C'],
       ['2007-01-04','B'],
       ['2007-01-06','C']]

df2 = [['2007-01-01','B',3],
       ['2007-01-02','A',4],
       ['2007-01-03','B',5],
       ['2007-01-06','C',3]]

df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)
df1[0] = pd.to_datetime(df1[0])
df2[0] = pd.to_datetime(df2[0])

当前 df1 | pd.merge():

    0           1   2
0   2007-01-06  C   3  

仅获取两个 df 之间的确切日期,不考虑最近日期的值。

预期的 df1:

    0           1   2
0   2007-01-01  A   NaN
1   2007-01-02  B   3
2   2007-01-03  C   NaN
3   2007-01-04  B   3
4   2007-01-06  C   3

获取 NaN,因为 df2 中该日期或该日期之前不存在数据。对于索引第 1 行,它获取前一天之前的数据,而索引第 4 行,它完全在同一天获取数据。

【问题讨论】:

    标签: python pandas dataframe data-manipulation


    【解决方案1】:

    使用您的合并代码(我假设您已经拥有该代码,因为它不存在于您的问题中),插入参数 how=lefthow=outer

    应该是这样的:

    dfmerged = pd.merge(df1, df2, how='left', left_on=['Date'], right_on=['Date'])  
    

    然后您可以使用切片和重命名来保留您想要的列。

    dfmerged = dfmerged[['Date', 'Letters', 'Numbers']]
    

    注意:我不知道您的列名,因为您没有显示任何代码。必要时替换

    【讨论】:

    • 我没有得到相同的预期df,我不确定你是否理解我的问题
    【解决方案2】:

    使用merge_asof检查你的输出

    pd.merge_asof(df1,df2,on=0,by=1,allow_exact_matches=True)
    Out[15]: 
               0  1    2
    0 2007-01-01  A  NaN
    1 2007-01-02  B  3.0
    2 2007-01-03  C  NaN
    3 2007-01-04  B  5.0 # here should be 5 since 5 ' date is more close. also df2 have two B 
    4 2007-01-06  C  3.0
    

    【讨论】:

    • 太棒了!你很有才华。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2018-09-10
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多