查找数据框中由另一列链接的两行之间的所有列的不匹配



我有一个包含许多列和行的大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 for identifier 4 (D vs. E)
  • 标识符2/3/4 col_3 (20 vs. 21,30 vs. 31,40 vs. 41)

允许使用任何表示形式,可以很容易地隔离导致不匹配的列、它们的值和标识符。

在这种情况下,您可以将列聚合为一个集合,并保留包含多个元素的列:

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}

最新更新