Сообщить об ошибке.

Метод .compare() объектов Series/DataFrame в pandas

Сравнивает Series/DataFrame и показывает различия

Синтаксис:

DataFrame.compare(other, align_axis=1, keep_shape=False, 
                  keep_equal=False, result_names=('self', 'other'))

Series.compare(other, align_axis=1, keep_shape=False, 
               keep_equal=False, result_names=('self', 'other'))

Параметры:

  • other - объект для сравнения (DataFrame или Series).
  • align_axis=1 - по какой оси выровнять сравнение. Если 0 или index, то различия складываются вертикально, строки выводятся поочередно из self и other. Если 1 или columns, то различия выровнены по горизонтали, столбцы выводятся поочередно из self и other.
  • keep_shape=False - если значение True, то сохраняются все строки и столбцы. В противном случае сохраняются только те, у которых другие значения.
  • keep_equal=False - если значение True, то в результате сохраняются равные значения. В противном случае равные значения отображаются как NAN.
  • result_names=('self', 'other') - задает имена DataFrame/Series при сравнении.

Возвращаемое значение:

  • DataFrame, который показывает различия. Результирующий индекс будет MultiIndex с поочередным расположением объектов self и other на внутреннем уровне.

Описание метода .compare() объектов Series/DataFrame:

Методы DataFrame.compare() и Series.compare сравнивает собственный объект с другим other объектом (DataFrame/Series) и показывает различия.

Когда два DataFrame/Series не имеют одинаковых меток или формы, то поднимается исключение ValueError.

Примечание:

  • Совпадающие NAN не будут отображаться как разница.
  • Можно сравнивать только с одинаковыми метками (т.е. одинаковую форму, идентичные метки строк и столбцов)

Примеры использования DataFrame.compare():

Для иллюстрации работы метода создадим DataFrame:

>>> import pandas as pd
df = pd.DataFrame(
    {
        "col1": ["a", "a", "b", "b", "a"],
        "col2": [1.0, 2.0, 3.0, np.nan, 5.0],
        "col3": [1.0, 2.0, 3.0, 4.0, 5.0]
    },
    columns=["col1", "col2", "col3"],
)

>>> df
#   col1  col2  col3
# 0    a   1.0   1.0
# 1    a   2.0   2.0
# 2    b   3.0   3.0
# 3    b   NaN   4.0
# 4    a   5.0   5.0

Создадим второй DataFrame из первого с изменениями:

# создадим 
>>> df2 = df.copy()
>>> df2.loc[0, 'col1'] = 'c'
>>> df2.loc[2, 'col3'] = 4.0
>>> df2
#   col1  col2  col3
# 0    c   1.0   1.0
# 1    a   2.0   2.0
# 2    b   3.0   4.0
# 3    b   NaN   4.0
# 4    a   5.0   5.0

Смотрим различия в столбцах:

>>> df.compare(df2)
#   col1       col3
#   self other self other
# 0    a     c  NaN   NaN
# 2  NaN   NaN  3.0   4.0

Присвоим результирующие имена (аргумент result_names)

>>> df.compare(df2, result_names=("left", "right"))
#   col1       col3
#   left right left right
# 0    a     c  NaN   NaN
# 2  NaN   NaN  3.0   4.0

Теперь распределим различия по строкам (аргумент align_axis=0):

>>> df.compare(df2, align_axis=0)
#         col1  col3
# 0 self     a   NaN
#   other    c   NaN
# 2 self   NaN   3.0
#   other  NaN   4.0

Сохраним равные значения (аргумент keep_shape=True):

>>> df.compare(df2, keep_shape=True)
#   col1       col2       col3
#   self other self other self other
# 0    a     c  NaN   NaN  NaN   NaN
# 1  NaN   NaN  NaN   NaN  NaN   NaN
# 2  NaN   NaN  NaN   NaN  3.0   4.0
# 3  NaN   NaN  NaN   NaN  NaN   NaN
# 4  NaN   NaN  NaN   NaN  NaN   NaN

Сохраним все исходные строки и столбцы, а также все исходные значения (аргумент keep_equal=True):

>>> df.compare(df2, keep_shape=True, keep_equal=True)
#   col1       col2       col3
#   self other self other self other
# 0    a     c  1.0   1.0  1.0   1.0
# 1    a     a  2.0   2.0  2.0   2.0
# 2    b     b  3.0   3.0  3.0   4.0
# 3    b     b  NaN   NaN  4.0   4.0
# 4    a     a  5.0   5.0  5.0   5.0

Примеры использования Series.compare():

>>> s1 = pd.Series(["a", "b", "c", "d", "e"])
>>> s2 = pd.Series(["a", "a", "c", "b", "e"])

Смотрим различия в столбцах

>>> s1.compare(s2)
#   self other
# 1    b     a
# 3    d     b

Смотрим различия по индексам

>>> s1.compare(s2, align_axis=0)
# 1  self     b
#    other    a
# 3  self     d
#    other    b
# dtype: object

Сохраните все исходные строки

>>> s1.compare(s2, keep_shape=True)
#   self other
# 0  NaN   NaN
# 1    b     a
# 2  NaN   NaN
# 3    d     b
# 4  NaN   NaN

Сохраните все исходные строки и все исходные значения

>>> s1.compare(s2, keep_shape=True, keep_equal=True)
#   self other
# 0    a     a
# 1    b     a
# 2    c     c
# 3    d     b
# 4    e     e