在python中使用唯一函数时保持顺序

在python中使用唯一函数时保持顺序,python,pandas,numpy,dataframe,indexing,Python,Pandas,Numpy,Dataframe,Indexing,我有一些代码,下面是我的df的列 df.columns = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2', 'E1', 'E2'] list = df.columns.str[:1] list = np.unique(list) 我试图得到字母和数字的唯一值,但顺序正确 我的代码不支持排序,我也不知道怎么做 多谢各位 预期产出: letters = [A, B, C, D, E] numbers = [1, 2] 假设您的示例具有代表性,您

我有一些代码,下面是我的df的列

df.columns = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2', 'E1', 'E2']

list = df.columns.str[:1]
list = np.unique(list)
我试图得到字母和数字的唯一值,但顺序正确

我的代码不支持排序,我也不知道怎么做

多谢各位

预期产出:

letters = [A, B, C, D, E]
numbers = [1, 2]

假设您的示例具有代表性,您可以使用我从中获得的一个简洁的小技巧。在Python3.6和更高版本中,dict是有序的,因此您可以将它们的键用作有效的有序集

list(dict.fromkeys(c[0] for c in df.columns))
# --> ['A', 'B', 'C', 'D', 'E']

list(dict.fromkeys(int(c[1]) for c in df.columns))
# --> [1, 2]

假设您的示例具有代表性,您可以使用我从中获得的一个简洁的小技巧。在Python3.6和更高版本中,dict是有序的,因此您可以将它们的键用作有效的有序集

list(dict.fromkeys(c[0] for c in df.columns))
# --> ['A', 'B', 'C', 'D', 'E']

list(dict.fromkeys(int(c[1]) for c in df.columns))
# --> [1, 2]
您可以使用。这与
itertools
文档中的
unique\u everseen
相同。在内部,它在维护所见项目的
的同时进行迭代

df = pd.DataFrame(columns=['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2', 'E1', 'E2'])

from toolz import unique

res = list(unique(df.columns.str[:1]))

['A', 'B', 'C', 'D', 'E']
一个更宽泛的解决方案是将
索引
对象转换为
pd.Series
,并使用
删除重复项
。这同样使用哈希:

res = df.columns.str[:1].to_series().drop_duplicates().values

array(['A', 'B', 'C', 'D', 'E'], dtype=object)
您可以使用。这与
itertools
文档中的
unique\u everseen
相同。在内部,它在维护所见项目的
的同时进行迭代

df = pd.DataFrame(columns=['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2', 'E1', 'E2'])

from toolz import unique

res = list(unique(df.columns.str[:1]))

['A', 'B', 'C', 'D', 'E']
一个更宽泛的解决方案是将
索引
对象转换为
pd.Series
,并使用
删除重复项
。这同样使用哈希:

res = df.columns.str[:1].to_series().drop_duplicates().values

array(['A', 'B', 'C', 'D', 'E'], dtype=object)

这一个使用正则表达式,如果列名中有多个字符/数字,它将继续工作:

import re
import pandas as pd

df = pd.DataFrame(columns=['EE2', 'A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D11', 'E1'])

split_ = [re.findall('\d+|\D+', col) for col in df.columns]

list(pd.Series([col[0] for col in split_]).drop_duplicates())
# ['EE', 'A', 'B', 'C', 'D', 'E']
list(pd.Series([col[1] for col in split_]).drop_duplicates())
# ['2', '1', '11']

这一个使用正则表达式,如果列名中有多个字符/数字,它将继续工作:

import re
import pandas as pd

df = pd.DataFrame(columns=['EE2', 'A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D11', 'E1'])

split_ = [re.findall('\d+|\D+', col) for col in df.columns]

list(pd.Series([col[0] for col in split_]).drop_duplicates())
# ['EE', 'A', 'B', 'C', 'D', 'E']
list(pd.Series([col[1] for col in split_]).drop_duplicates())
# ['2', '1', '11']

总是一个字母和一个数字吗?或者它可以改变?什么是
df
?熊猫数据帧?总是一个字母和一个数字吗?或者它可以改变?什么是
df
?熊猫数据帧?我正在进一步研究这个问题,因为我的专栏中确实有300万欧元300万欧元300万英镑,所以这确实更有帮助。然而,以3m3m欧元为例,regex将3m3m欧元划分为3,m,3,m(与预期的“3m3m”输出相反,你能解释一下“re.findall('\d+\d+')”对我来说,我可以修改代码,将欧元和英镑列在列表1中,将3m、3m3m、6m3m列在第二个列表中?我正在进一步研究这一点,因为我的列中确实有3m欧元3m3m英镑6m3m,所以这确实更有帮助。然而,以3m欧元为例,regex将3m欧元拆分为3,m,3,m(与预期的“3m3m”输出相反,您能否解释“re.findall('\d+\d+')”对我来说,我可以修改代码,在列表1中使用欧元和英镑,在第二个列表中使用3m、3m3m、6m3m?谢谢FHTMitchell;在这种情况下,我需要将python更新为2.版本的im。谢谢FHTMitchell;在这种情况下,我需要将python更新为2.版本的im。