Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 添加新数据时更新除一行以外的所有行_Python_Python 3.x_Pandas - Fatal编程技术网

Python 添加新数据时更新除一行以外的所有行

Python 添加新数据时更新除一行以外的所有行,python,python-3.x,pandas,Python,Python 3.x,Pandas,我目前有一个工作算法,允许我根据数据库(BaseA)的ID和DateB的值以及新导出(BaseB)中的值更新数据库的行。问题是我的算法效率很低。这只是一个例子,真正的代码必须适用于任意数量的列,而不管它们的名称是什么(到处都可以找到的唯一列是ID、DateB和NbTreated)(也可以列出它们) 如何加快计算速度?(目前实际数据需要将近一个小时) 巴塞亚: BaseB: 我想要的是: 我的代码通常没有算法: 我目前使用且正在运行的算法: 努力工作: 灵感来自 这给了我这个输出: ID

我目前有一个工作算法,允许我根据数据库(BaseA)的
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
编辑: 该算法应该使用新导出的值更新BaseABaseB中的值是数据库中案例的最新版本。如果我在BaseABaseB中有相同的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