Найти несоответствие во всех столбцах между двумя строками, связанными другим столбцом в кадре данных
У меня есть большой 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}