在具有 return 个字符分隔值的列上使用 get_dummies

Use get_dummies on columns with return character separated values

我有一个数据框,其中一列的值就像一个列表,但由 return 字符 (\n) 而不是逗号分隔。我尝试如下使用 get_dummies 函数但没有成功。

是否可以直接使用get_dummies功能?或者需要用逗号替换 return 字符?

# 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 的最佳方法是整理数据,以便一行是一个观察值。在这种情况下,我有一排是一个 Acitivity 或公园拥有的一个公园特色。所以以你为例,这就是我所做的

# 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

列中的项目被视为一个字符串,而不是元素列表。例如,'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,只能应用于一个DataFrame系列。因此,您需要将函数分别应用于每一列。

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_dummiesprefix 参数不能与 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