Python 添加新数据时更新除一行以外的所有行
我目前有一个工作算法,允许我根据数据库(BaseA)的Python 添加新数据时更新除一行以外的所有行,python,python-3.x,pandas,Python,Python 3.x,Pandas,我目前有一个工作算法,允许我根据数据库(BaseA)的ID和DateB的值以及新导出(BaseB)中的值更新数据库的行。问题是我的算法效率很低。这只是一个例子,真正的代码必须适用于任意数量的列,而不管它们的名称是什么(到处都可以找到的唯一列是ID、DateB和NbTreated)(也可以列出它们) 如何加快计算速度?(目前实际数据需要将近一个小时) 巴塞亚: BaseB: 我想要的是: 我的代码通常没有算法: 我目前使用且正在运行的算法: 努力工作: 灵感来自 这给了我这个输出: ID
ID
和DateB
的值以及新导出(BaseB)中的值更新数据库的行。问题是我的算法效率很低。这只是一个例子,真正的代码必须适用于任意数量的列,而不管它们的名称是什么(到处都可以找到的唯一列是ID
、DateB
和NbTreated
)(也可以列出它们)
如何加快计算速度?(目前实际数据需要将近一个小时)
巴塞亚:
BaseB:
我想要的是:
我的代码通常没有算法:
我目前使用且正在运行的算法:
努力工作:
灵感来自
这给了我这个输出:
ID DateA DateB DateC Nb Treated
A 11/07/2017 11/07/2017 11/07/2017 1
B 14/06/2017 12/07/2017 14/06/2017 2
B 13/06/2017 13/06/2017 13/06/2017 3
B 13/06/2017 10/05/2017 13/06/2017 1
C 13/07/2017 1
C 14/06/2017 14/06/2017 14/06/2017 2
D 14/07/2017 14/07/2017 14/07/2017 1
E 15/07/2017 15/07/2017 15/07/2017 1
F 16/07/2017 1
G 17/07/2017 15/09/2016 17/07/2017 1
G 17/07/2017 17/07/2017 17/07/2017 2
H 11/06/2017 11/06/2017 0
I 12/06/2017 12/06/2017 12/06/2017 1
J 18/07/2017 18/07/2017 0
编辑:
该算法应该使用新导出的值更新BaseA。BaseB中的值是数据库中案例的最新版本。如果我在BaseA和BaseB中有相同的ID,可能会有不同的情况:-通常您会从BaseA中删除行,而将BaseB中的行放入
-但是如果BaseA中的行的
DateB
与BaseB中的一行不同,则两行都应位于BaseA中。但您每次都必须更新其他列。您没有尝试解释您的逻辑。让我们来分析你的代码并找出答案。我个人不想那样做。我怀疑其他人也不这么认为。我的建议是花点时间解释一下,除了提供代码外,为什么还应该获得所需的结果。这应该有助于你找到你想要的答案。谢谢,我已经添加了逻辑解释。你没有试图解释你的逻辑。让我们来分析你的代码并找出答案。我个人不想那样做。我怀疑其他人也不这么认为。我的建议是花点时间解释一下,除了提供代码外,为什么还应该获得所需的结果。这应该可以帮助你找到你想要的答案。谢谢,我已经添加了逻辑解释
ID DateA DateB DateC
A 11/07/2017 11/07/2017 11/07/2017
B 13/06/2017 13/06/2017 13/06/2017
C 14/06/2017 14/06/2017 14/06/2017
E 15/07/2017 15/07/2017 15/07/2017
F 16/07/2017 16/07/2017 16/07/2017
H 11/06/2017 11/06/2017
I 12/06/2017 12/06/2017 12/06/2017
ID DateA DateB DateC Nb Treated
A 11/07/2017 11/07/2017 11/07/2017 1
B 13/06/2017 12/07/2017 13/06/2017 2
B 13/06/2017 13/06/2017 13/06/2017 3
B 13/06/2017 10/05/2017 13/06/2017 1
C 14/06/2017 14/06/2017 14/06/2017 2
C 14/06/2017 13/07/2017 14/06/2017 1
D 14/07/2017 14/07/2017 14/07/2017 1
E 15/07/2017 15/07/2017 15/07/2017 1
F 16/07/2017 16/07/2017 16/07/2017 1
G 17/07/2017 17/07/2017 17/07/2017 2
G 17/07/2017 15/09/2016 17/07/2017 1
H 11/06/2017 11/06/2017 0
I 12/06/2017 12/06/2017 12/06/2017 1
J 18/07/2017 18/07/2017 0
import pandas as pd
import numpy as np
database = pd.read_excel("baseA.xlsx")
dataset = pd.read_excel("baseB.xlsx")
# INSERT THE ALGORITHM HERE
datater = pd.concat([database,dataset])
datater.drop_duplicates(["ID","DateB"], inplace = True)
datater["Nb Treated"] = np.where(pd.isnull(datater["Nb Treated"]) & pd.isnull(datater["DateB"]), 0,datater["Nb Treated"])
datatri = datater.groupby(["ID"], sort=False)["Nb Treated"].max()
dicoREFNbDevis = datatri.to_dict()
datater["Nb Treated"] = np.where(pd.isnull(datater["Nb Treated"]), datater["ID"],datater["Nb Treated"])
dicoREFNbDevis = {k: v+1 for k, v in dicoREFNbDevis.items()}
datater["Nb Treated"].replace(dicoREFNbDevis, inplace=True)
datater["Nb Treated"]=datater["Nb Treated"].fillna(1)
datater=datater.sort(["ID"])
datater=datater[["ID","DateA","DateB","DateC","Nb Treated"]]
writer = pd.ExcelWriter('NewBase.xlsx', engine='xlsxwriter')
datater.to_excel(writer, sheet_name='Base', index=False)
writer.save()
database = database[~((database["ID"].isin(dataset["ID"].unique())) & (pd.isnull(database["DateB"])))]
for i in dataset :
if i != "ID" and i != "DateB" and i != "Nb Treated" :
dicoDate = dataset.set_index("ID")[i].to_dict()
database[i]=np.where(database["ID"].isin(dataset["ID"].unique()),database["ID"],database[i])
database[i].replace(dicoDate, inplace=True)
database[i]=database[i].apply(lambda x : pd.to_datetime(x))
database = database[~((database["ID"].isin(dataset["ID"].unique())) & (pd.isnull(database["DateB"])))]
database.ix[database["ID"].isin(dataset["ID"].unique()), ['DateA','DateC']] = dataset.ix[dataset["ID"].isin(database["ID"].unique()), ['DateA','DateC']]
ID DateA DateB DateC Nb Treated
A 11/07/2017 11/07/2017 11/07/2017 1
B 14/06/2017 12/07/2017 14/06/2017 2
B 13/06/2017 13/06/2017 13/06/2017 3
B 13/06/2017 10/05/2017 13/06/2017 1
C 13/07/2017 1
C 14/06/2017 14/06/2017 14/06/2017 2
D 14/07/2017 14/07/2017 14/07/2017 1
E 15/07/2017 15/07/2017 15/07/2017 1
F 16/07/2017 1
G 17/07/2017 15/09/2016 17/07/2017 1
G 17/07/2017 17/07/2017 17/07/2017 2
H 11/06/2017 11/06/2017 0
I 12/06/2017 12/06/2017 12/06/2017 1
J 18/07/2017 18/07/2017 0