Найти несоответствие во всех столбцах между двумя строками, связанными другим столбцом в кадре данных

У меня есть большой df со многими столбцами и строками, обычно с двумя строками на определенный идентификатор, поскольку df используется для согласования. Есть ли способ упростить идентификацию столбцов без идентификаторов, которые вызывают несоответствие?

      import pandas as pd

df = pd.DataFrame({'col_1':       ['A', 'B', 'C', 'B', 'C', 'D', 'E'],
                    'identifier': [  1,   2,   3,   2,   3,   4,   4],
                    'col_3':      [ 10,  20,   30,  21, 31,  40,  41],
                    'col_4':      [  1,   1,    1,   1,  1,   1,   1]
                    })

В приведенном выше df это будет

  • col_1 для идентификатора 4 (D против E)
  • col_3 для идентификатора 2/3/4 (20 против 21, 30 против 31, 40 против 41)

Открыто для любого представления, которое позволяет легко изолировать столбцы, вызывающие несоответствие, их значения и идентификаторы.

2 ответа

IIUC, вы можете объединить столбцы в наборы и сохранить те, которые содержат более одного элемента:

      s = df.groupby('identifier').agg(set).stack()
out = s[s.str.len().gt(1)]

выход:

      identifier       
2           col_3    {20, 21}
3           col_3    {30, 31}
4           col_1      {D, E}
            col_3    {40, 41}
dtype: object

дальнейшее объединение:

      out.reset_index(level=1)['level_1'].groupby(level=0).agg(list)

выход:

      identifier
2           [col_3]
3           [col_3]
4    [col_1, col_3]
Name: level_1, dtype: object
      mismatch = df.groupby('identifier').agg(set).applymap(lambda x: x if len(x) > 1 else np.nan)
col_1_mismatch = mismatch[['col_1']].dropna()
col_3_mismatch = mismatch[['col_3']].dropna()
print(col_1_mismatch)
print(col_3_mismatch)

Выход:

                   col_1
identifier
4           {D, E}


               col_3
identifier
2           {20, 21}
3           {30, 31}
4           {40, 41}
Другие вопросы по тегам