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

How to remove the duplicate string completely from the list using 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:删除所有行中的重复项:

您可以使用 .drop_duplicates() with parameter keep=False after splitting and expanding the substrings by .str.split() and .explode().

然后,通过 .groupby() on the row index (level 0). Finally, aggregate and join back the substrings of the original same row with .agg()','.join

将条目重新分组到它们的原始行中
df['result'] = (df['text_column'].str.split(',')
                                 .explode()
                                 .drop_duplicates(keep=False)
                                 .groupby(level=0).agg(','.join)
               )

.drop_duplicates() 和参数 keep=False 确保删除重复项,包括源值。

或者,你也可以用.stack() in place of .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

请注意保留最后两行相同的字符串,因为它们在不同的行中。