【问题标题】:Use get_dummies on columns with return character separated values在具有返回字符分隔值的列上使用 get_dummies
【发布时间】:2019-08-30 04:54:20
【问题描述】:

我有一个数据框,其中一列的值就像是一个列表,但用返回字符(\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,它允许您提供分隔符。可以为每一列单独执行此操作,添加前缀,然后连接结果。

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


【解决方案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

【讨论】:

  • 谢谢 Matthew Borlowe,但是,它不起作用。甚至使用您发布的示例执行 ctrl + c ctrl + v 。在这两种情况下,错误是相同的。我相信这与变量的范围有关,因为列在倒数第二行声明并在最后一行代码中使用:NameError: name 'columns' is not defined
  • 更新的代码在columns=['attributes'] 的最后一行遗漏了一个等号,所以现在尝试运行,它对我有用
  • 非常感谢 Matthew Borlowe
【解决方案2】:

列中的项目被视为一个字符串,而不是元素列表。例如,'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,只能应用于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不能和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  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    相关资源
    最近更新 更多