我有pd.Series
个列表项。如果两个位置有一个或多个共同的列表项,则将两个位置定义为重复项。此定义应该是 transitive ,这意味着如果位置A
和B
是重复的,而位置B
和C
是重复的,则位置{ {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
是重复的,因为行1
和0
是重复的,行3
和1
也是如此。
3
在此示例中,有两个独立的重复组。
答案 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')