панды изменяют размер листа Excel, чтобы он соответствовал большему для сравнения

#python #pandas

#python #pandas

Вопрос:

У меня есть два листа Excel, которые мне нужно сравнить. У одного из них может быть большее количество строк / столбцов, поэтому для сравнения мне нужно увеличить меньший фрейм данных (и, возможно, заполнить излишек NAN?) чтобы сделать сравнение возможным.

больший фрейм данных: введите описание изображения здесь

меньший фрейм данных: введите описание изображения здесь

фрейм данных, который мне нужно использовать для сравнения с меньшим фреймом данных: введите описание изображения здесь

Код прилагается ниже. Я в основном перебираю две папки, проверяя наличие пар файлов с одинаковыми именами, чтобы затем я мог сравнить Лист1 между ними.

 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)
 

для value_NEW = cogDf.iat[строка, столбец]
выдает код:
Ошибка атрибута: объект ‘tuple’ не имеет атрибута ‘iat’

Я пытался использовать атрибут iat, чтобы затем перебирать каждую ячейку в dataframe и сравнивать различия между двумя листами. Вот почему я думал преобразовать кортеж (который я получаю от использования.выровнять) по фрейму данных, чтобы затем иметь возможность сравнивать фреймы данных в .iat

Желаемый результат может быть практически таким же, как в этом руководстве: https://matthewkudija.com/blog/2018/07/21/excel-diff /

В идеале я также хотел бы рассматривать имена столбцов как часть фрейма данных (для сравнения, я также иногда получаю различия в именах столбцов, но данные в столбцах — это одинаковые наборы между двумя файлами Excel)

Комментарии:

1. small, _ = df_small.align(df_large); print(small)

Ответ №1:

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
 

Комментарии:

1. Похоже, что align преобразует фрейм данных в кортеж? Мне нужен этот выровненный фрейм данных для дальнейшего сравнения с использованием iat. Могу ли я как-то преобразовать кортеж в dataframe?

2. Можете ли вы показать мне код, с которым вы сейчас работаете, и желаемый результат?

3. Я говорю это, потому что, если df1 является фреймом данных, тогда df2 также должен быть изменен на фрейм данных, поэтому я подозреваю, что проблема где-то еще.

4. Спасибо за комментарий, я добавил код к своему первоначальному вопросу.

5. Попробуйте изменить cogDf = cogDf.align(hypDf, axis = None) на cogDf, hypDf = cogDf.align(hypDf, axis = None) и hypDf = hypDf.align(cogDf, axis = None) на hypDf, cogDf = hypDf.align(cogDf, axis = None) . Это должно гарантировать, что оба являются фреймами данных, а не кортежами.