【问题标题】:How to merge 2 pandas data frames and update a column with latest value from 2 matched rows?如何合并 2 个 pandas 数据框并从 2 个匹配的行中更新具有最新值的列?
【发布时间】:2021-04-07 18:00:12
【问题描述】:

我有 2 个具有多列的 pandas 数据框。

除了一列是updated_at之外,一些行在所有列中都有相同的值。

我需要合并 2 个数据框并考虑匹配行中的最新 updated_at 值。 updated_at 是一个日期时间值。

我找到了一种合并数据框的方法,但不确定如何使用 updated_at 列的最新值。

pd.merge(
    df1,
    df2,
    how="inner",
    on=["column_1", "column_2", "column_3"])

这是df1df2 的示例输入。

df1:

MRN  Encounter ID First Name Last Name  Birth Date       updated_at 
1          1234       John       Doe  01/02/1999  04/12/2002 6:00 PM   
2          2345     Joanne       Lee  04/19/2002  04/19/2002 7:22 PM   
3          3456  Annabelle     Jones  01/02/2001  04/21/2002 5:00 PM

df2:

MRN  Encounter ID First Name Last Name  Birth Date       updated_at 
1          1234       John       Doe  01/02/1999  04/12/2002 5:00 PM   
2          2345     Joanne       Lee  04/19/2002  04/19/2002 8:22 PM

final_output:

MRN  Encounter ID First Name Last Name  Birth Date       updated_at 
1          1234       John       Doe  01/02/1999  04/12/2002 6:00 PM   
2          2345     Joanne       Lee  04/19/2002  04/19/2002 8:22 PM   
3          3456  Annabelle     Jones  01/02/2001  04/21/2002 5:00 PM

请注意,updated_at 列具有来自匹配记录的最新值。

【问题讨论】:

  • 这取决于latest 的值,对吧?其余的只是合并并决定保留哪一个(来自 df1 或 df2)。 df2 是否总是将“updated_at”视为“最新”?
  • df2 并不总是具有最新的 updated_at 值。有时它可能在df1 的匹配行中。
  • 我认为您需要详细说明输入和预期输出。否则,它涉及很多猜测。检查这个stackoverflow.com/questions/20109391/…
  • 更新了输入和预期输出的问题。
  • 你见过这个解决方案吗stackoverflow.com/questions/24614474/…

标签: python python-3.x pandas dataframe pandas-groupby


【解决方案1】:

类似的东西可以完成这项工作......

只需确保您的 updated_at 列设置为 datetime

>>> pd.concat([df1,df2]).sort_values('updated_at').drop_duplicates(subset=df1.columns[:-1],keep='last').sort_values('MRN')
    MRN Encounter_ID First_Name   Last_Name  Birth_Date          updated_at
1  1234         John        Doe  01/02/1999  04/12/2002 2020-12-31 06:00:00
2  2345       Joanne        Lee  04/19/2002  04/19/2002 2020-12-31 08:22:00
3  3456    Annabelle      Jones  01/02/2001  04/21/2002 2020-12-31 05:00:00

【讨论】:

    【解决方案2】:

    我很确定,这是一个可以完成此任务的示例。不要使用合并,而是使用concat,然后使用groupbyagg,如下所示。

    A = pd.DataFrame({'Name':['John','Joe'], 'Val':['1','3']})
    
       Name Val
    0  John   1
    1   Joe   3
    
    B = pd.DataFrame({'Name':['John','Joe'], 'Val':['4','2']})
    
       Name Val
    0  John   4
    1   Joe   2
    
    C = pd.concat([A,B]).groupby('Name').agg('max').reset_index()
    
       Name Val
    0   Joe   3
    1  John   4
    

    在此示例中,Val 列对应于您的 updated_at 列,Name 列是您要匹配以组合在一起的所有列。

    【讨论】:

      【解决方案3】:

      如果您想包含一个数据框中不存在于另一个数据框中的行,那么您不想在合并中使用inner,您需要how='outer'

      df = df1.merge(df2, how='outer', on=df1.columns[:-1].tolist())
      

      然后您可以通过以下方式获取最新更新:

      df['updated_at'] = df[['updated_at_x', 'updated_at_y']].max(axis=1)
      

      并删除不必要的列:

      df = df.drop(columns=['updated_at_x', 'updated_at_y'])
      

      输出:

         MRN  Encounter ID First Name Last Name  Birth Date          updated_at
      0    1          1234       John       Doe  01/02/1999 2002-04-12 18:00:00
      1    2          2345     Joanne       Lee  04/19/2002 2002-04-19 20:22:00
      2    3          3456  Annabelle     Jones  01/02/2001 2002-04-21 17:00:00
      

      【讨论】:

        猜你喜欢
        • 2020-11-30
        • 2020-10-19
        • 2020-12-22
        • 2021-08-23
        • 2017-05-18
        • 2015-04-17
        • 1970-01-01
        • 1970-01-01
        • 2022-09-27
        相关资源
        最近更新 更多