在python中使用唯一功能时保持顺序

时间:2018-08-28 15:37:10

标签: 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]

3 个答案:

答案 0 :(得分:2)

假设您的示例具有代表性,则可以使用我从Raymond Hettinger获得的巧妙技巧。在python 3.6及更高版本中,字典是有序的,因此您可以将其键用作有效的有序集。

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]

答案 1 :(得分:1)

您可以改用toolz.unique。这与unique_everseen文档中的itertools recipe相同。从内部进行迭代,同时保留set个可见项。

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']

一个更可疑的解决方案是将Index对象转换为pd.Series并使用drop_duplicates。再次使用哈希:

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

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

答案 2 :(得分:1)

此列使用正则表达式,如果列名中包含多个字符/数字,则该列将继续工作:

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']