首页 > 解决方案 > 根据 id 列检查数据框中某些值的相似性

问题描述

我有一个这样的df:

ix  y1  y2  id
ix1 X   X   AP10579
ix2 E   E   AP17998
ix3 C   C   AP283716
ix4 C   C   AP283716
ix5 E   E   AP17998
ix6 T   T   AP21187
ix7 X   Z   AP10579
ix8 T   K   AP21187
ix9 E   E   AP12457
ix10 C  C   Ap87930

在 id 列中,我们有两个相似的 id(fx ix1 和 ix7 具有相同的 id,ix2 和 ix5,依此类推)。我们还有一些唯一的 id,
我想检查这两个 id 中的每一个的 y1+y2 是否相同,如果它们相同,那么将其中一个移动到新的 df 中,同时移动每个唯一的 id,

所以我应该有一个新的df,df_new,像这样:

ix  y1  y2  id
ix2 E   E   AP17998
ix3 C   C   AP283716
ix9 E   E   AP12457
ix10 C  C   Ap87930

任何建议表示赞赏。

 df = {
    'ix': ['ix1','ix2','ix3','ix4','ix5','ix6','ix7','ix8','ix9','ix10'],
    'y1': ['X','E','C','C','E','T','X','T', 'E','C'],
    'y2': ['X','E','C','C','E','T','Z','K', 'E','C'],
    'id': ['AP10579','AP17998','AP283716','AP283716','AP17998','AP21187','AP10579','AP21187', 'AP12457', 'Ap87930']
}

标签: pandas

解决方案


这是一种可能的方法:

df = pd.DataFrame({
    'ix': ['ix1','ix2','ix3','ix4','ix5','ix6','ix7','ix8','ix9','ix10'],
    'y1': ['X','E','C','C','E','T','X','T', 'E','C'],
    'y2': ['X','E','C','C','E','T','Z','K', 'E','C'],
    'id': ['AP10579','AP17998','AP283716','AP283716','AP17998','AP21187','AP10579','AP21187', 'AP12457', 'Ap87930']
})

def filter_df(g):
    if len(g) == 1:
        return g.iloc[0]
    if g.y1.unique().size + g.y2.unique().size == 2:
        return g.iloc[0]


df.groupby('id').agg(filter_df).dropna().reset_index()

输出:

         id    ix y1 y2
0   AP12457   ix9  E  E
1   AP17998   ix2  E  E
2  AP283716   ix3  C  C
3   Ap87930  ix10  C  C

推荐阅读