在具有 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_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
我有一个数据框,其中一列的值就像一个列表,但由 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_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