调整excel表的大小以匹配较大的表进行比较

2024-09-19 23:30:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张excel表格需要比较。其中一个可能有更多的行/列,因此相比之下,我需要放大更小的数据帧(并可能用nan填充多余的数据帧?)使比较成为可能。你知道吗

更大的数据帧: enter image description here

较小的数据帧: enter image description here

我需要使用dataframe与较小的dataframe进行比较: enter image description here

代码附在下面。我基本上是遍历两个文件夹,检查具有相同名称的文件对,这样我就可以比较它们之间的Sheet1。你知道吗

import pandas as pd
import os

hypPath = ("C:\\dirTest\\hyperionDIR\\")
cogPath = ("C:\\dirTest\\cognosDIR\\")
hypFiles = os.listdir(hypPath)
cogFiles = os.listdir(cogPath)

for hypFilename in hypFiles:
    for cogFilename in cogFiles:
        if cogFilename == hypFilename:
            # print("file: " + cogFilename + " has a pair!")

        hypDf = pd.ExcelFile(hypPath + hypFilename)
        cogDf = pd.ExcelFile(cogPath + cogFilename)
        hypDf = hypDf.parse(0)
        cogDf = cogDf.parse(0)

        if hypDf.size >= cogDf.size:
            diffFile = hypDf.copy()
            cogDf = cogDf.align(hypDf,axis = None)
        else:
            diffFile = cogDf.copy()
            hypDf = hypDf.align(cogDf,axis = None)

        for row in range(diffFile.shape[0]):
            for col in range(diffFile.shape[1]):
                value_OLD = hypDf.iat[row, col]
                value_NEW = cogDf.iat[row, col]
                if value_OLD == value_NEW:
                    diffFile.iat[row, col] = cogDf.iat[row, col]
                else:
                    diffFile.iat[row, col] = ('{}→{}').format(value_OLD, value_NEW)

对于值\u NEW=cogDf.iat公司[行,列] 代码抛出: AttributeError:“tuple”对象没有属性“iat”

我试图使用iat属性遍历数据帧中的每个单元格,并比较两张表之间的差异。这就是为什么我要考虑将tuple(使用.align得到的)转换为dataframe,以便能够比较.iat上的dataframes

所需的输出可能与本教程中的几乎相同:https://matthewkudija.com/blog/2018/07/21/excel-diff/

理想情况下,我还希望将列名视为数据框架的一部分(相比之下,我有时也会得到列命名差异,但列中的数据在两个excel文件之间是相同的集)


Tags: 数据indataframenewforvaluecolexcel
1条回答
网友
1楼 · 发布于 2024-09-19 23:30:31

coldspeed是正确的您可以使用align。你知道吗

import pandas as pd

data1 = {"x": [123, 123, 123],
        "y": [123, 123, 123],
        'z': [123, 123, 123]}

data2 = {"x": [123, 123, 123],
        "y": [123, 123, 123]}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

df1, df2 = df1.align(df2, axis = None)

print(df1)
print(df2)

     x    y    z
0  123  123  123
1  123  123  123
2  123  123  123
     x    y   z
0  123  123 NaN
1  123  123 NaN
2  123  123 NaN

这应该适用于你问题的第二部分。你知道吗

import pandas as pd
import os

hypPath = ("C:\\dirTest\\hyperionDIR\\")
cogPath = ("C:\\dirTest\\cognosDIR\\")

hypFiles = os.listdir(hypPath)
cogFiles = os.listdir(cogPath)

for hypFilename in hypFiles:
    for cogFilename in cogFiles:
        if cogFilename == hypFilename:
            #print("file: " + cogFilename + " has a pair!")
            hypDf = pd.ExcelFile(hypPath + hypFilename)
            cogDf = pd.ExcelFile(cogPath + cogFilename)
            hypDf = hypDf.parse(0)
            cogDf = cogDf.parse(0)
        if hypDf.size >= cogDf.size:
            diffFile = hypDf.copy()
            cogDf, hypDf = cogDf.align(hypDf,axis = None)
        else:
            diffFile = cogDf.copy()
            hypDf, cogDf = hypDf.align(cogDf,axis = None)

type(hypDf)
pandas.core.frame.DataFrame
type(cogDf)
pandas.core.frame.DataFrame

相关问题 更多 >