Pandas:使用匹配行的条件在多个列键上合并两个数据集

Pandas:使用匹配行的条件在多个列键上合并两个数据集,pandas,Pandas,我遇到的情况是,我正在尝试获取最新的数据视图。我在一个Pandas数据框中有传入的新数据,我需要将其与现有数据的另一个数据框合并。我有一个包含关键列的列表(以匹配两个数据帧之间的行) 我需要一个结果数据帧,其中包含每个数据帧中不存在的所有行(基于键)。但是,当键在两个数据帧中时,我需要比较“trantime”列,以查看哪个是最新的,并使用该行 以下是设置: import pandas as pd from datetime import datetime, timedelta # Use th

我遇到的情况是,我正在尝试获取最新的数据视图。我在一个Pandas数据框中有传入的新数据,我需要将其与现有数据的另一个数据框合并。我有一个包含关键列的列表(以匹配两个数据帧之间的行)

我需要一个结果数据帧,其中包含每个数据帧中不存在的所有行(基于键)。但是,当键在两个数据帧中时,我需要比较“trantime”列,以查看哪个是最新的,并使用该行

以下是设置:

import pandas as pd
from datetime import datetime, timedelta

# Use this list of columns to join the 2 dataframes.
key_columns = ['col1','col2']

time = datetime.now()

existing_df = pd.DataFrame(dict(
    col1=[0,1,1,2],
    col2=['a','b','c','b'],
    attr1=['this','is','just','something'],
    trantime=[
        time - timedelta(days=1),
        time,
        time - timedelta(days=2),
        time - timedelta(days=3)
    ]
))

new_df = pd.DataFrame(dict(
    col1=[1,2,2],
    col2=['b','b','c'],
    attr1=['plus','more','stuff'],
    trantime=[
        time - timedelta(days=1),
        time,
        time]
))

# How do I get this:
expected_output_df = pd.DataFrame(dict(
    col1=[0,1,1,2,2],
    col2=['a','b','c','b','c'],
    attr1=['this','is','just','more','stuff'],
    trantime=[
        time - timedelta(days=1),
        time,
        time - timedelta(days=2),
        time,
        time
    ]
))
我曾尝试使用isin(),但无法使它与键的多个列一起工作。我假设我也将使用concat()。我尝试使用merge(),但这会在结果数据框中创建带有“\u x”/“\u y”后缀的列

有人能帮忙吗?提前感谢您的时间

可能会有帮助,不过我想merge也可以做同样的事情:

 existing_df = existing_df.sort_values('trantime')
 new_df = new_df.sort_values('trantime')

res = (pd.merge_ordered(existing_df, new_df, on = key_columns)
       #check if there is a new column
       .assign(attr1_x = lambda x: np.where(x.attr1_x.isna() & (x.attr1_y.notna()),
                                            x.attr1_y,x.attr1_x),
               #compare time entries to get latest
           trantime_x = lambda x: np.where((x.trantime_x.isna()|x.trantime_x.lt(x.trantime_y)),
                                           x.trantime_y, x.trantime_x
                                          )
          )
       #strip off the last two columns
       .iloc[:,:-2]
      )

res



   col1 col2    attr1_x        trantime_x
0   0   a       this        2020-06-03 06:59:56.012913
1   1   b       is          2020-06-04 06:59:56.012913
2   1   c       just        2020-06-02 06:59:56.012913
3   2   b       something   2020-06-04 06:59:56.012913
4   2   c       stuff       2020-06-04 06:59:56.012913
也许会有帮助,不过我想merge也可以做同样的事情:

 existing_df = existing_df.sort_values('trantime')
 new_df = new_df.sort_values('trantime')

res = (pd.merge_ordered(existing_df, new_df, on = key_columns)
       #check if there is a new column
       .assign(attr1_x = lambda x: np.where(x.attr1_x.isna() & (x.attr1_y.notna()),
                                            x.attr1_y,x.attr1_x),
               #compare time entries to get latest
           trantime_x = lambda x: np.where((x.trantime_x.isna()|x.trantime_x.lt(x.trantime_y)),
                                           x.trantime_y, x.trantime_x
                                          )
          )
       #strip off the last two columns
       .iloc[:,:-2]
      )

res



   col1 col2    attr1_x        trantime_x
0   0   a       this        2020-06-03 06:59:56.012913
1   1   b       is          2020-06-04 06:59:56.012913
2   1   c       just        2020-06-02 06:59:56.012913
3   2   b       something   2020-06-04 06:59:56.012913
4   2   c       stuff       2020-06-04 06:59:56.012913