我有一些代码,例如,以下是我的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]
答案 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']