熊猫根据列表项重复行

时间:2020-04-09 06:27:44

标签: python python-3.x pandas duplicates

我有pd.Series个列表项。如果两个位置有一个或多个共同的列表项,则将两个位置定义为重复项。此定义应该是 transitive ,这意味着如果位置AB是重复的,而位置BC是重复的,则位置{ {1}}和A是重复项。

示例:

C

所有行都是重复的。请注意,行 In [117]: df Out[117]: A dupe_group_ix 0 [A, B] 0 1 [D, X] 0 2 [B] 0 3 [D, A] 0 4 [A] 0 0是重复的,因为行10是重复的,行31也是如此。

3

在此示例中,有两个独立的重复组。

2 个答案:

答案 0 :(得分:1)

您可以使用助手功能来映射组ID:

grp = {'_':-1}
def map_grp_id(x):
    grp_id = np.max([grp.get(e, -1) for e in x])
    if grp_id < 0:
        grp_id = max(grp.values())+1
        grp.update({e:grp_id for e in x})
    return grp_id

df['dupe_group_ix'] = df.A.apply(map_grp_id)

    A       dupe_group_ix
0   [A, B]              0
1   [D, X]              1
2   [B]                 0
3   [D, K]              1
4   [A]                 0

答案 1 :(得分:0)

@Allen答案的改进版本,速度更快(150ms对1min46sec),并且允许nan和空列。

        grp = {}

        def map_grp_id(x):
            for e in x:
                grp_id = grp.get(e, None)
                if grp_id is not None:
                    break
            else:
                grp_id = len(grp)
            grp.update({e: grp_id for e in x})
            return grp_id

        df.loc[df['A'].map(len, na_action='ignore').eq(0), 'A'] = pd.NA
        df['dupe_group_ix'] = pd.NA
        df['dupe_group_ix'] = df['dupe_group_ix'].astype(pd.Int64Dtype())
        df['dupe_group_ix'] = df[A].map(map_grp_id, na_action='ignore')