#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) . Это должно гарантировать, что оба являются фреймами данных, а не кортежами.