我有一个数据框,其中一列具有值,就好像它是一个列表一样,但是由返回字符(\ 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']
结果:所有值都串联在一起的列。
答案 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