Может кто-нибудь объяснить этот кусок кода для определения различий между двумя кадрами данных? - PullRequest
0 голосов
/ 29 октября 2019
resultBool = (results_01 != results_02).stack() 
resultdiff = pd.concat([results_01.stack()[resultBool], results_02.stack()[resultBool]], axis=1)
resultdiff.columns=["output_01", "output_02"]

Я нашел этот фрагмент кода онлайн для сравнения двух CSV-файлов и распечатал разницу. Я не совсем уверен в логике первых двух строк, может кто-то объяснить большое спасибо.

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Например, давайте рассмотрим два недавно созданных фрейма данных:

import pandas as pd

# Creating the first dataframe
df1 = pd.DataFrame({"A":[1,5,7,8], 
                  "B":[5,8,4,3], 
                  "C":[10,4,9,3]}) 

# Creating the second dataframe 
df2 = pd.DataFrame({"A":[5,3,6,4], 
                  "B":[11,2,4,3], 
                  "C":[4,3,8,5]})

Они выглядят так:

enter image description here

Не равное выражению != просто возвращает new df с true / false, где значения не равны .

enter image description here

stack изменяет структуру данных с новыми индексами. Подробнее здесь .

enter image description here

resultBool = (df1 != df2).stack() 

В приведенной выше строке сохраняется результирующее значение df (как показано на втором рисунке) впеременная.

Следующая строка отфильтровывает все ложные значения из нашего исходного кадра данных.

enter image description here

Обратите внимание, как индекс 2 B отсутствует, так как значение в resultBool df равно false.

Это означает, что значения в df1 и df2 для этой конкретной ячейки равны, поэтому результат оператора != равен false.

Мы делаем то же самое для df2 и просто объединяем результатыпо горизонтали. Подробнее о сцеплении панд здесь .

enter image description here

На приведенном выше изображении столбец «0» ссылается на значения в df1 и столбце«1» относится к значениям в df2.

Наконец, мы переименовываем эти столбцы в «output_01» и «output_02»:

enter image description here

Конечным результатом является новое выделение значений df, которые отличаются в обоих кадрах данных.

0 голосов
/ 29 октября 2019

resultBool является результатом DataFrame.stack(), который распаковывает результаты двух файлов CSV с именами result_01 и result_02 в единый столбец со значениями True и False, с именами столбцов, которые теперь складываютсякак MultiIndex, которые представляют, есть ли различия между ними, с True, представляющим разницу с results_01 != results_02.

resultdiff выполняет pd.concat по горизонтали, передавая resultBool, что сохранит только результаты вышеупомянутого resultBool.

После чего resultdiff устанавливает столбцы.

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

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.stack.html
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html

...