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')