在具有返回字符分隔值的列上使用get_dummies

时间:2019-04-09 00:45:48

标签: python-3.x pandas dataframe dummy-variable

我有一个数据框,其中一列具有值,就好像它是一个列表一样,但是由返回字符(\ 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 个答案:

答案 0 :(得分:1)

为了使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

答案 1 :(得分:0)

列中的项目被视为一个字符串,而不是元素列表。例如,'esportes\nrecreação infantil\ncontemplação'只是一项,而不是由三项组成的列表。

虽然不可能直接将.get_dummies()应用于这种情况,但是,如ALollz所建议的那样,使用一行代码来解决此问题的相对简单的方法是使用pd.Series.str.get_dummies()

# 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,只能应用于Series。因此,您需要将该功能分别应用于每个列。

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