如何删除列中字符串的重复部分并对值进行排序

How can I remove duplicate parts of a string, within a column and sort the values

我有一个这样的数据框(假设只有一列):

column
[A,C,B,A]
[HELLO,HELLO,ha]
[test/1, test/1, test2]

上面那一列的类型是: dtype('O')

我想删除这里的重复项,结果是:

column
[A,C,B]                  # - A
[HELLO, ha]               # removing 1 hello
[test/1, test2]  # removing 1 test/1 

然后,我想对数据进行排序

column
[A,B,C]                  
[ha, HELLO]             
[test2, test/1]  # assuming that number comes before / 

我正在努力以正确的方式完成这项工作。希望大家有好的想法(转换成小列表有意义吗?)

杠杆设置。

如果已经是列表

df['column2']=[list(set(x)) for x in df.column.to_list()]

       

     column          column2
0             [A, C, B, A]        [A, C, B]
1       [HELLO, HELLO, ha]      [HELLO, ha]
2  [test/1, test/1, test2]  [test2, test/1]

否则

df['column2']=df['column'].str.replace('\]|\[','',regex=True).str.split(',').map(set).map(list)

df['column2']=df['column'].str.replace('\]|\[','',regex=True).apply(lambda x:list(set(x.split(','))))


       

                  column          column2
0             [A, C, B, A]        [A, C, B]
1       [HELLO, HELLO, ha]      [HELLO, ha]
2  [test/1, test/1, test2]  [test2, test/1]

集合是一种类似于列表的数据类型,但它只包含唯一值。这意味着您可以将列表转换为集合,然后再转换回列表(如果您想要这些唯一值的列表)。

然后你会写这样的东西:

list(set(name_of_the_list))

假设您在列中有 个列表,请使用列表理解。

如果要维持秩序:

df['column_keep_order'] = [list(dict.fromkeys(x)) for x in df['column']]

如果要对项目进行排序:

df['column_sorted'] = [sorted(set(x)) for x in df['column']]

输出:

                    column column_keep_order    column_sorted
0             [A, C, B, A]         [A, C, B]        [A, B, C]
1       [HELLO, HELLO, ha]       [HELLO, ha]      [HELLO, ha]
2  [test/1, test/1, test2]   [test/1, test2]  [test/1, test2]

可重现的输入:

df = pd.DataFrame({'column': [['A','C','B','A'],
                              ['HELLO','HELLO','ha'],
                              ['test/1', 'test/1', 'test2']]})

dataframe 中的嵌套列表不是一个好的使用习惯,也许是为了解决一些非常具体的问题。我强烈建议您阅读如何坚持 tidy paradigm(我知道这是从 R 的角度来看的,但它可以很容易地转录成 python)。

尽管如此,使用 Numpy 函数作为 uniquesort 可以为您的示例完成工作,假设 df 是您的数据框:

在数据框上使用 for 循环

df = pd.DataFrame({"col" : 
                   [["A","C","B","A"],
                    ["HELLO","HELLO","ha"],
                    ["test/1", "test/1", "test2"]]})
    
for n, value in df.iterrows():
    df.loc[n, "col"] = np.sort(np.unique(value.loc["col"]))

df
Out[77]: 
               col
0        [A, B, C]
1      [HELLO, ha]
2  [test/1, test2]

使用应用映射

df2 = pd.DataFrame({"col" : 
                   [["A","C","B","A"],
                    ["HELLO","HELLO","ha"],
                    ["test/1", "test/1", "test2"]]})
    
df2 = df2.applymap(lambda x : np.sort(np.unique(x)))

df2
Out[75]: 
               col
0        [A, B, C]
1      [HELLO, ha]
2  [test/1, test2]