У меня есть фрейм данных, в котором столбец имеет значения, как если бы это был список, но разделенный символом возврата (\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']
Результат: столбцы со всеми конкатенированными значениями.
Вам придется немного очистить свои данные, чтобы заставить функцию 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
Обновленный код пропустил знак равенства в последней строке columns=['attributes']
, поэтому попробуйте сейчас, просто запустил, и у меня это сработало.
Большое спасибо Мэтью Борлоу
Элементы в столбцах рассматриваются как одна строка, а не как список элементов. Например, '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
Используйте
pd.Series.str.get_dummies
, что позволяет указать разделитель. Можно сделать это отдельно для каждого столбца, добавить префикс и затем объединить результаты.