如何删除列中字符串的重复部分并对值进行排序
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
函数作为 unique
和 sort
可以为您的示例完成工作,假设 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]
我有一个这样的数据框(假设只有一列):
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
函数作为 unique
和 sort
可以为您的示例完成工作,假设 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]