【问题标题】:How to compare two dataframes and update with the new value如何比较两个数据框并使用新值进行更新
【发布时间】:2020-09-29 14:03:57
【问题描述】:

使用 Panda Dataframes,我想比较两个 DF 并更新 Excel 表。 问题,我从我的代码中看到,它只附加新行。它不会更新前一行。 例如: DF1:

{'Sheet1': [{'ID': 1.0, 'NAME': 'hostname1', 'IP_ADDRESS': '192.168.1.1', 'STATUS': 'completed'}, {'ID': 2.0, 'NAME': 'hostname2', 'IP_ADDRESS': '192.168.1.2', 'STATUS': 'completed'}, {'ID': 3.0, 'NAME': 'hostname3', 'IP_ADDRESS': '192.168.1.3', 'STATUS': 'in_progress'}, {'ID': 4.0, 'NAME': 'hostname4', 'IP_ADDRESS': '192.168.1.4', 'STATUS': 'completed'}]}

DF2:

{'Sheet1': [{'ID': 1.0, 'NAME': 'hostname1', 'IP_ADDRESS': '192.168.1.1', 'STATUS': 
'completed'}, {'ID': 2.0, 'NAME': 'hostname2', 'IP_ADDRESS': '192.168.1.2', 'STATUS': 'problem'}, {'ID': 3.0, 'NAME': 'hostname3', 'IP_ADDRESS': '192.168.1.3', 'STATUS': 'rma'}, {'ID': 4.0, 'NAME': 'hostname4', 'IP_ADDRESS': '192.168.1.4', 'STATUS': 'completed'},
{'ID': 5.0, 'NAME': 'hostname5', 'IP_ADDRESS': '192.168.1.5', 'STATUS': 'future'}]}

如您所见,DF2 具有不同的值。

这是代码,它显示两个 DF 不同,但不会更新工作表。

def writexlsx_multi_sheets(filename, data, sheet_name, **to_excel_kwargs):

from openpyxl import load_workbook

orginalDF = pd.read_excel(filename, sheet_name=sheet_name, index=False)
newDF = pd.DataFrame.from_dict(data)
if 'engine' in to_excel_kwargs:
    to_excel_kwargs.pop('engine')

writer = pd.ExcelWriter(filename, engine='openpyxl')
writer.book = load_workbook(filename)
writer.sheets = {ws.title:ws for ws in writer.book.worksheets}

if not orginalDF.equals(newDF):
    result = orginalDF.combine_first(newDF)
    result.to_excel(writer, sheet_name=sheet_name, index=False)
    writer.save()
else:
    return False

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    如果您不需要将 openpyxl 用于任何特定的事情,那么您可以坚持使用 pandas:

    import pandas as pd
    
    df_o = pd.read_excel(file_name)
    df_n = pd.read_csv(file_path + 'df_b.csv')
    

    df_o

       ID   HOSTNAME           IP       STATUS
    0   1  hostname1  192.168.0.1    completed
    1   2  hostname2  192.168.0.2    completed
    2   3  hostname3  192.168.0.3  in_progress
    3   4  hostname4  192.168.0.4    completed 
    

    df_n

       ID   HOSTNAME           IP     STATUS
    0   1  hostname1  192.168.0.1  completed
    1   2  hostname2  192.168.0.2    problem
    2   3  hostname3  192.168.0.3        rma
    3   4  hostname4  192.168.0.4  completed
    4   5  hostname5  192.168.0.5     future
    

    然后你的组合数据框:

    if not df_o.equals(df_n):
        df = df_n.combine_first(df_o)
        df.to_excel(file_name, index=False)
    
    df_c = pd.read_excel(file_name)
    

    df_c

       ID   HOSTNAME           IP     STATUS
    0   1  hostname1  192.168.0.1  completed
    1   2  hostname2  192.168.0.2    problem
    2   3  hostname3  192.168.0.3        rma
    3   4  hostname4  192.168.0.4  completed
    4   5  hostname5  192.168.0.5     future
    

    如果您像日志文件或网络抓取一样实时附加记录,Openpyxl 有很好的流写入支持。也许您的用例更类似于 CRUD,如果您不处理大量数据,使用 pandas 覆盖文件可能会解决问题。

    无论如何,我相信这条线result = orginalDF.combine_first(newDF) 是倒退的。它应该是result = newDF.combine_first(originalDF)。 pandas 的文档很不错,请查看 combine_first() 函数 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-01
      • 2022-11-18
      • 2019-06-13
      • 2021-09-17
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多