Используйте get_dummies для столбцов с возвращаемыми символами разделенными значениями - PullRequest
1 голос
/ 09 апреля 2019

У меня есть фрейм данных, в котором столбец имеет значения, как если бы это был список, но разделенный возвращаемым символом (\ 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']

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

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Вам нужно будет немного очистить ваши данные, чтобы заставить 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
0 голосов
/ 25 июня 2019

Элементы в столбцах рассматриваются как одна строка, а не как список элементов. Например, '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  
...