Используйте get_dummies для столбцов с возвращаемыми значениями, разделенными символами

У меня есть фрейм данных, в котором столбец имеет значения, как если бы это был список, но разделенный символом возврата (\n) вместо запятой. Я попытался использовать функцию get_dummies, как показано ниже, но безуспешно.

Можно ли напрямую использовать функцию get_dummies? Или необходимость замены возвращаемого символа запятой?

# import xlsx:
parques = pd.read_excel('Tabelão.xlsx')

# get_dummies:
parques = pd.get_dummies(parques, columns = ['Atividades', 'Configuração'])

# Dataframe example:
Atividades = ['esportes\nrecreação infantil\ncontemplação', 'contemplação\nrecreação infantil\nesporte', 'contemplação\nrecreação infantil', 'contemplação\nrecreação infantil\neventos culturais']
Configuração = ['relevo plano\nriacho\nlagos\nbosque\nrede de lojas', 'beria-rio\nedificações\nesplandanadas\nrede de lojas', 'bosque\nrede de caminhos\nrecantos ', 'relevo predominantemente plano\nlago\nriacho']
Nome = ['Parque Julien Rien', 'Parque da Residência', 'Feliz Lusitânia', 'Parque Barigüi']

parques = pd.DataFrame([Nome, Atividades, Configuração])

parques = parques.T

parques.columns = ['Nome', 'Atividades', 'Configuração']

Результат: столбцы со всеми конкатенированными значениями.

Используйте pd.Series.str.get_dummies, что позволяет указать разделитель. Можно сделать это отдельно для каждого столбца, добавить префикс и затем объединить результаты.

ALollz 09.04.2019 06:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
584
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам придется немного очистить свои данные, чтобы заставить функцию get_dummies работать правильно. Лучший способ использовать get_dummies — иметь аккуратные данные, чтобы одна строка соответствовала одному наблюдению. В этом случае у меня есть одна строка, представляющая собой либо одну деятельность, либо одну парковую функцию, которую имеет парк. Итак, взяв ваш пример, я сделал это

# Dataframe example:
Atividades = ['esportes\nrecreação infantil\ncontemplação', 
              'contemplação\nrecreação infantil\nesporte',
              'contemplação\nrecreação infantil', 
              'contemplação\nrecreação infantil\neventos culturais']
Configuracao = ['relevo plano\nriacho\nlagos\nbosque\nrede de lojas', 
                'beria-rio\nedificações\nesplandanadas\nrede de lojas', 
                'bosque\nrede decaminhos\nrecantos ', 
                'relevo predominantemente plano\nlago\nriacho']
Nome = ['Parque Julien Rien', 'Parque da Residência', 
        'Feliz Lusitânia','Parque Barigüi']
#splits the strings on the \n symbol to create lists of attributes for each park
Atividades = [x.split('\n') for x in Atividades]
Configuracao = [x.split('\n') for x in Configuracao]

#this tidys the data so that one row is one observation which 
#makes using get_dummies easier
list_df = []
i = 0
for name in Nome:
    for y in range(len(Atividades[i])):
        list_df.append([name, Atividades[i][y]])
    for x in range(len(Configuracao[i])):
        list_df.append([name, Configuracao[i][x]])
    i += 1
#creates the dataframe from the list of lists and then turns it into a
#dummy dataframe where the park name is the index value and a column has
#a 1 or 0 if the park has that attribute
test_df = pd.DataFrame(list_df, columns=['park_name', 'attributes'])
dummies = pd.get_dummies(test_df, columns=['attributes']).groupby(['park_name']).sum()

Что дает этот вывод максимально очищенным для отображения здесь:

               beria-rio    bosque contemplação edificações esplandanadas
park_name                   
Feliz Lusitânia         0   1   1   0   0
Parque Barigüi          0   0   1   0   0
Parque Julien Rien      0   1   1   0   0
Parque da Residência    1   0   1   1   1

Спасибо, Мэтью Борлоу, но это не сработало. Даже ctrl + c ctrl + v с примером, который вы опубликовали. В обоих случаях ошибка одна и та же. Я считаю, что это связано с областью действия переменной, поскольку столбцы были объявлены в предпоследней строке и использованы в последней строке кода: NameError: name 'columns' is not defined

Ângelo 09.04.2019 21:58

Обновленный код пропустил знак равенства в последней строке columns=['attributes'], поэтому попробуйте сейчас, просто запустил, и у меня это сработало.

Matthew Barlowe 09.04.2019 22:02

Большое спасибо Мэтью Борлоу

Ângelo 09.04.2019 22:11

Элементы в столбцах рассматриваются как одна строка, а не как список элементов. Например, 'esportes\nrecreação infantil\ncontemplação' — это только один элемент, а не список, состоящий из трех элементов.

Хотя невозможно применить .get_dummies() напрямую к такому случаю, относительно более простой способ решить эту проблему — с помощью одной строки кода — использовать pd.Series.str.get_dummies(), как предложил ALollz.

# Create a dictionary
data = {'Atividades' : ['esportes\nrecreação infantil\ncontemplação', 
              'contemplação\nrecreação infantil\nesporte',
              'contemplação\nrecreação infantil', 
              'contemplação\nrecreação infantil\neventos culturais'],
        'Configuracao' : ['relevo plano\nriacho\nlagos\nbosque\nrede de lojas', 
                'beria-rio\nedificações\nesplandanadas\nrede de lojas', 
                'bosque\nrede decaminhos\nrecantos ', 
                'relevo predominantemente plano\nlago\nriacho'],
        'Nome' : ['Parque Julien Rien', 'Parque da Residência', 
        'Feliz Lusitânia','Parque Barigüi']}

# Create a DataFrame
parques = pd.DataFrame.from_dict(data)

Обратите внимание, что существует два метода .get_dummies(): один — pandas.get_dummies, который можно применять к DataFrame, а другой — pandas.Series.str.get_dummies, который можно применять только к серии. Поэтому вам нужно применить функцию к каждому столбцу отдельно.

In []: parques['Atividades'].str.get_dummies(sep='\n')
Out[]: 
   contemplação  esporte  esportes  eventos culturais  recreação infantil
0             1        0         1                  0                   1
1             1        1         0                  0                   1
2             1        0         0                  0                   1
3             1        0         0                  1                   1

Если вы также хотите добавить префикс, вы можете использовать .add_prefix(). (параметр приставкаpandas.get_dummies нельзя использовать с pandas.Series.str.get_dummies)

In []: parques['Atividades'].str.get_dummies(sep='\n').add_prefix("Atividades_")

Out[]: 
   Atividades_contemplação  Atividades_esporte  Atividades_esportes  \
0                        1                   0                    1   
1                        1                   1                    0   
2                        1                   0                    0   
3                        1                   0                    0   

   Atividades_eventos culturais  Atividades_recreação infantil  
0                             0                              1  
1                             0                              1  
2                             0                              1  
3                             1                              1  

Другие вопросы по теме

Как суммировать продукты фрейма данных pandas?
Превратите URL-адрес geojson в pandas (разбор)
В чем разница между groupby.first, groupby.nth, groupby.head, когда as_index=False
Повторяющаяся ошибка HTTP 413 при очистке нескольких страниц
Умножение определенных ячеек, перечисленных по индексу строки в столбце фрейма данных, на константу
Как правильно идентифицировать значения с плавающей запятой [0, 1], содержащие точку, в типе объекта DataFrame?
Пытаюсь получить расстояние, используя долготу и широту, но продолжаю работать с ошибкой: объект «Серия» не имеет атрибута «радианы»
Найдите процент от общего количества категорий, отсортируйте от самой высокой до самой низкой, сохраните имена первых 80% и переименуйте все остальные в «другие»
Изменить значение элемента с учетом флага
Добавление наблюдений с одинаковым столбцом и создание одной уникальной строки для каждого наблюдения