Как сравнить два кадра данных и отфильтровать строки и столбцы, где обнаружена разница - PullRequest
0 голосов
/ 31 августа 2018

Я проверяю фреймы данных на равенство.

df_diff=(df1!=df2)

Я получаю df_diff, который имеет ту же форму, что и df*, и содержит логическое значение True/False.

Теперь я хотел бы сохранить только столбцы и строки df1, где было хотя бы другое значение. Если я просто сделаю

   df1=[df_diff.values]

Я получаю все строки , где был хотя бы один True в df_diff, но многие столбцы изначально имели только False.

В качестве второго шага я хотел бы иметь возможность заменить все значения (поэлементно в кадре данных), которые были равны (где df_diff==False), на NaNs.

пример:

df1=pd.DataFrame(data=[[1,2,3],[4,5,6],[7,8,9]])
df2=pd.DataFrame(data=[[1,99,3],[4,5,99],[7,8,9]])

Я бы хотел получить от df1

   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9

до

    1  2
0  2  NaN  
1  NaN  6

1 Ответ

0 голосов
/ 31 августа 2018

Я думаю, вам нужно DataFrame.any для проверки хотя бы одного True на строки столбцов:

df = df_diff[df_diff.any(axis=1)]

Можно отфильтровать оба исходных кадра данных следующим образом:

df11 = df1[df_diff.any(axis=1)]
df22 = df2[df_diff.any(axis=1)]

Если хотите все столбцы и строки:

df = df_diff.loc[df_diff.any(axis=1), df_diff.any()]

РЕДАКТИРОВАТЬ: Фильтр d1 и добавить NaN с where:

df_diff=(df1!=df2)

m1 = df_diff.any(axis=1)
m2 = df_diff.any()

out = df1.loc[m1, m2].where(df_diff.loc[m1, m2])
print (out)
     1    2
0  2.0  NaN
1  NaN  6.0
...