如何使用pandas python从列表中完全删除重复的字符串?



我有一个DataFrame如下:

index text_column
0   ,(Unable_to_see),(concern_code),(concern_color),(Unable_to_see)
1   ,Info_concern,Info_concern
2   ,color_Concern,color_Concern,no_category
3   ,reg_Concern,reg_Concern

我试图在每行中完全删除包括源值在内的重复项。

我试过了:

df['result'] = [set(x) for x in df['text_column']]

这给了我一个没有重复值的值列表,但有源值,我需要源值也被删除。

所需输出:

result

0  (concern_code),(concern_color)
1  
2  no_category
3  

有什么建议吗?

版本1:删除所有行的重复项:

可以用.str.split().explode()拆分和展开子串后使用带keep=False参数的.drop_duplicates()

然后,通过行索引(级别0)上的.groupby()将条目重新分组到它们的原始行中。最后,使用.agg()','.join聚合并连接回原始同一行的子字符串

df['result'] = (df['text_column'].str.split(',')
.explode()
.drop_duplicates(keep=False)
.groupby(level=0).agg(','.join)
)

带参数keep=False.drop_duplicates()确保删除包括源值在内的重复项。

或者,您也可以使用.stack()代替.explode(),如下所示:

df['result'] = (df['text_column'].str.split(',', expand=True)
.stack()
.drop_duplicates(keep=False)
.groupby(level=0).agg(','.join)
)

数据输入:

(从有问题的样本数据中添加了额外的测试用例:)

text_column
0  (Unable_to_see),(concern_code),(concern_color),(Unable_to_see)
1                                       Info_concern,Info_concern
2                         color_Concern,color_Concern,no_category
3                                         reg_Concern,reg_Concern
4                                                    ABCDEFGHIJKL
5                                                    ABCDEFGHIJKL

结果:

print(df)
text_column                          result
0  (Unable_to_see),(concern_code),(concern_color),(Unable_to_see)  (concern_code),(concern_color)
1                                       Info_concern,Info_concern                             NaN
2                         color_Concern,color_Concern,no_category                     no_category
3                                         reg_Concern,reg_Concern                             NaN
4                                                    ABCDEFGHIJKL                             NaN
5                                                    ABCDEFGHIJKL                             NaN

请注意,即使在不同的行中,具有相同字符串的最后2行也会作为重复项被删除。

版本2:仅删除同一行中的重复项:

如果删除重复项的范围仅限于同一行,而不是跨所有行,我们可以通过以下代码变体来实现:

df['result'] = (df['text_column'].str.split(',', expand=True)
.stack()
.groupby(level=0)
.agg(lambda x: ','.join(x.drop_duplicates(keep=False)))
)

数据输入:

(从有问题的样本数据中添加了额外的测试用例:)

text_column
0  (Unable_to_see),(concern_code),(concern_color),(Unable_to_see)
1                                       Info_concern,Info_concern
2                         color_Concern,color_Concern,no_category
3                                         reg_Concern,reg_Concern
4                                                    ABCDEFGHIJKL
5                                                    ABCDEFGHIJKL

输出:

print(df)
text_column                          result
0  (Unable_to_see),(concern_code),(concern_color),(Unable_to_see)  (concern_code),(concern_color)
1                                       Info_concern,Info_concern                                
2                         color_Concern,color_Concern,no_category                     no_category
3                                         reg_Concern,reg_Concern                                
4                                                    ABCDEFGHIJKL                    ABCDEFGHIJKL
5                                                    ABCDEFGHIJKL                    ABCDEFGHIJKL

注意具有相同字符串的最后2行被保留,因为它们在不同的行。

最新更新