Python 使用条件合并2个类似的数据帧

Python 使用条件合并2个类似的数据帧,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,上下文 我有一个由csv文件组成的数据库。我每个月都会收到新文件,我需要用这些文件更新我的数据库。但是,我不能覆盖一个重要数据的更改,因为我需要跟踪它的历史记录 问题 我有两个数据帧,看起来像这样-前3列是关键: Database dataframe (DD) ID1 ID2 ID3 important_data some_date1 some_data2 date 1 2 3 10 X Y 2019


上下文
我有一个由csv文件组成的数据库。我每个月都会收到新文件,我需要用这些文件更新我的数据库。但是,我不能覆盖一个重要数据的更改,因为我需要跟踪它的历史记录

问题
我有两个数据帧,看起来像这样-前3列是关键:

Database dataframe (DD)
ID1  ID2  ID3  important_data  some_date1  some_data2  date
1    2    3    10              X            Y          2019-09-19 14:53:16.107278
4    5    6    10              M            N          2019-07-15 14:53:16.107278

Database client (DC)
ID1  ID2  ID3  important_data  some_date1  some_data2  date
1    2    3    15              A            B          2019-10-19 14:53:16.107278
4    5    6    10              O            P          2019-09-18 14:53:16.107278
第一个DF是我数据库中的DF。第二个是我的客户给我的新的
如果与date中最后一个匹配的元组相比,“重要的_数据”没有改变(id为4 5 6的情况),我将用新数据覆盖旧数据:

New Database dataframe (DD)
ID1  ID2  ID3  important_data  some_date1  some_data2  date
1    2    3    10              X            Y          2019-09-19 14:53:16.107278
4    5    6    10              O            P          2019-09-18 14:53:16.107278
否则(ID 1 2 3-或者如果raw是全新的),我需要在数据库框架中写入一个全新的raw:

New Database dataframe (DD)
ID1  ID2  ID3  important_data  some_date1  some_data2  date
1    2    3    10              X            Y          2019-09-19 14:53:16.107278
1    2    3    15              A            B          2019-10-19 14:53:16.107278
4    5    6    10              M            N          2019-07-15 14:53:16.107278
问题
我可以使用像这样的常规嵌套ifs(算法):

但是,就机器所需的资源而言,是否有可能使用合并来简化它?我试着看了看,但不太一样。我也在看concat,但我找不到办法

谢谢

附言:我试着用例子尽可能清楚,但如果不够清楚,请随时要求澄清

这应该可以

# imports
import pandas as pd
import datetime

# ignore (just for setting up the problem)
db_df = pd.DataFrame({
    "ID1": [1, 4],
    "ID2": [2, 5],
    "ID3": [3, 6],
    "important_data": [10, 10],
    "some_date1": ["X", "M"],
    "some_date2": ["Y", "N"],
    "date": [datetime.datetime.strptime("2019-09-19 14:53:16.107278", '%Y-%m-%d %H:%M:%S.%f'),
             datetime.datetime.strptime("2019-09-19 14:53:16.107278", '%Y-%m-%d %H:%M:%S.%f')]
})

# ignore (just for setting up the problem)
db_df_client = pd.DataFrame({
    "ID1": [1, 4],
    "ID2": [2, 5],
    "ID3": [3, 6],
    "important_data": [15, 10],
    "some_date1": ["A", "O"],
    "some_date2": ["B", "P"],
    "date": [datetime.datetime.strptime("2019-09-19 14:53:16.107278", '%Y-%m-%d %H:%M:%S.%f'),
             datetime.datetime.strptime("2019-09-19 14:53:16.107278", '%Y-%m-%d %H:%M:%S.%f')]
})

# the line you care about
pd.concat([db_df, db_df_client]).drop_duplicates(subset=['ID1','ID2','ID3','important_data'], keep='first')

客户改变了主意,要求保留所有数据,因此我使用了@WeNYoBen solution,但您的回答对我的主要问题来说是正确的,谢谢:)!
# imports
import pandas as pd
import datetime

# ignore (just for setting up the problem)
db_df = pd.DataFrame({
    "ID1": [1, 4],
    "ID2": [2, 5],
    "ID3": [3, 6],
    "important_data": [10, 10],
    "some_date1": ["X", "M"],
    "some_date2": ["Y", "N"],
    "date": [datetime.datetime.strptime("2019-09-19 14:53:16.107278", '%Y-%m-%d %H:%M:%S.%f'),
             datetime.datetime.strptime("2019-09-19 14:53:16.107278", '%Y-%m-%d %H:%M:%S.%f')]
})

# ignore (just for setting up the problem)
db_df_client = pd.DataFrame({
    "ID1": [1, 4],
    "ID2": [2, 5],
    "ID3": [3, 6],
    "important_data": [15, 10],
    "some_date1": ["A", "O"],
    "some_date2": ["B", "P"],
    "date": [datetime.datetime.strptime("2019-09-19 14:53:16.107278", '%Y-%m-%d %H:%M:%S.%f'),
             datetime.datetime.strptime("2019-09-19 14:53:16.107278", '%Y-%m-%d %H:%M:%S.%f')]
})

# the line you care about
pd.concat([db_df, db_df_client]).drop_duplicates(subset=['ID1','ID2','ID3','important_data'], keep='first')