поддержание порядка при использовании уникального fuction в python - PullRequest
0 голосов
/ 28 августа 2018

У меня есть некоторый код, где следующие, скажем, столбцы моего 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 голосов
/ 28 августа 2018

Вместо этого можно использовать toolz.unique. Это идентично рецепту unique_everseen , найденному в itertools документах. Внутренне он выполняет итерацию, сохраняя 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)
0 голосов
/ 28 августа 2018

Этот использует регулярное выражение и будет продолжать работать, если у вас есть несколько символов / цифр в именах столбцов:

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']
0 голосов
/ 28 августа 2018

Предполагая, что ваш пример является репрезентативным, вы можете использовать аккуратный маленький трюк, который я получил от 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...