#python #python-3.x #pandas #dataframe
#python #python-3.x #pandas #фрейм данных
Вопрос:
У меня есть фрейм данных, как показано ниже:
df = pd.DataFrame({'a':[1,2,3,4],
'b':["west, east", "east, north","south, west","east, south"]})
a b
0 1 west, east
1 2 east, north
2 3 south, west
3 4 east, south
Я хочу получить уникальные строки из столбца b
, как показано ниже.
Ожидаемый результат:
["east", "west", "north", "south"] # order doesn't matter here
Мои усилия
op = []
for _, value in df['b'].items():
op.extend(value)
op = set(op)
Что дает мне правильный результат, но есть ли более эффективный способ сделать это?
В моем исходном наборе данных около миллиона строк и 1000 значений unqiue.
Ответ №1:
Вы можете создать длинную строку с помощью join
, затем split
и преобразовать в set
, последний в list
:
a = list(set(', '.join(df['b']).split(', ')))
print (a)
['south', 'north', 'west', 'east']
Или используйте set comprehension
с split
и сглаживание:
a = list(set([y for x in df['b'] for y in x.split(', ')]))
print (a)
['south', 'north', 'west', 'east']
Чистое решение pandas — использовать Series.str.split
, DataFrame.stack
, Series.unique
и преобразовать в list
:
a = df.b.str.split(', ', expand=True).stack().unique().tolist()
Комментарии:
1. Спасибо 🙂 Просто любопытно… Есть ли способ сделать то же самое с
pandas
методами?2. @AkshayNevrekar — Да, но это явно медленнее, дайте мне секунду.
Ответ №2:
Вам нужно будет профилировать свой код, чтобы определить, быстрее ли это для вашего конкретного случая использования, но использование встроенных векторизованных методов pandas может принести некоторую пользу для больших наборов данных.
Попробуйте использовать комбинацию Series.str.split() и Series.unique() .
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas .Series.str.split.html
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas .Series.unique.html
# Split column of lists into strings
df_split = df['b'].str.rsplit(',', n=-1, expand=True)
# For each column, get unique values and append to set
uniques = set()
for col in df_split:
uniques.update(df_split[col].unique())