Возврат разницы в ячейках в панде - PullRequest
0 голосов
/ 04 мая 2018

Вот код, который работает как ожидалось.

Из: Вывод разницы в двух кадрах данных Pandas рядом - выделение разницы

import sys
if sys.version_info[0] < 3:
    from StringIO import StringIO
else:
    from io import StringIO

DF1 = StringIO("""id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 "He was late to class"
112  Nick   1.11                     False                "Graduated"
113  Zoe    NaN                     True                  " "
""")
DF2 = StringIO("""id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 "He was late to class"
112  Nick   1.21                     False                "Graduated"
113  Zoe    NaN                     False                "On vacation" """)


df1 = pd.read_table(DF1, sep='\s+', index_col='id')
df2 = pd.read_table(DF2, sep='\s+', index_col='id')


df_all = pd.concat([df1, df2], 
                   axis='columns', keys=['First', 'Second'])

df_final = df_all.swaplevel(axis='columns')[df1.columns[1:]]

def highlight_diff(data, color='yellow'):
    attr = 'background-color: {}'.format(color)
    other = data.xs('First', axis='columns', level=-1)
    return pd.DataFrame(np.where(data.ne(other, level=0), attr, ''),
                        index=data.index, columns=data.columns)

df_final.style.apply(highlight_diff, axis=None)

Единственная проблема в том, что мне не нужен первый ряд (111), потому что нет различий.

Как выбрать только измененные строки без использования функции highlight_diff? Я хочу вернуть строки 112 и 113 бок о бок без выделения, как показано в ответе Теда.

1 Ответ

0 голосов
/ 07 мая 2018
df_select = df_final.copy()
df_select.columns = df_final.columns.swaplevel()
duplicate = (df_select['First'] == df_select['Second']).all(axis=1)
df_final = df_final[~duplicate]

Пояснение: Мы создаем второй фрейм данных df_select для выбора соответствующих строк (и копируем df_final, чтобы ваш оригинал не изменялся). Его столбцы поменялись местами, так что First и Second находятся на 0-м уровне. Тогда строки, которые вы хотите выбросить, это те, в которых First и Second совпадают. Мы изменили df_final, чтобы содержать только недублированные строки.

РЕДАКТИРОВАТЬ: Если вы не хотите использовать df_final вообще, но вместо df_all:

duplicate = (df_all['First'] == df_all['Second']).drop('Comment', axis=1).all(axis=1)
result = df_all[~duplicate]

(Я предполагаю, что вы не хотите проверять комментарии, как и в предыдущей процедуре. Если вы хотите, удалите drop.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...