Python: сравните два кадра данных Pandas и получите индексы различий - PullRequest
2 голосов
/ 24 сентября 2019

Я хотел бы сравнить два кадра данных Pandas и получить индексы различий.

import numpy as np
import pandas as pd

rng = pd.date_range('2019-03-04', periods=5)
cols = ['A', 'B', 'C', 'D']

df1 = pd.DataFrame(np.arange(20).reshape(5, 4), index=rng, columns=cols)
df2 = pd.DataFrame(np.arange(20).reshape(5, 4), index=rng, columns=cols)

df2.iloc[2, 2] = 100
df2.iloc[3, 1] = 50

df1.equals(df2)  # OK, good to know, but where is the difference?
df1 == df2  # Nice, too. But I'm interested in the indices!

# I need a list containing [(2,2), (3,1)]. Even more intuitive would be something like [('2019-03-06', 'C'), ('2019-03-07', 'B')]

РЕДАКТИРОВАТЬ: мне не обязательно нужен список, но что-то, чтобы идентифицировать индексы.То есть, если есть простой и интуитивно понятный способ решить эту проблему без списка, это нормально.Тем не менее, список также будет в порядке.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

Я думаю, вы можете просто использовать np.where, как показано ниже

r, c = np.where(df1 != df2)
list(zip(r,c))

, который возвращает

[(2, 2), (3, 1)]

Редактировать

Вышеприведенное не будет работать, если кадры данных имеют другой тип индекса, в этом случае вместо этого следует сравнивать массив numpy

 r, c = np.where(df1.values != df2.values)
2 голосов
/ 24 сентября 2019

Работает ли это:

np.array(np.nonzero(df1.ne(df2).values)).transpose()

вывод:

array([[2, 2],
   [3, 1]], dtype=int64)

Другой способ:

df1.mask(df1.eq(df2)).stack().index.values

Вывод:

array([(2, 2), (3, 1)], dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...