Estou tentando substituir os valores em uma coluna de um dataframe. A coluna ('feminino') contém apenas os valores 'feminino' e 'masculino'.
Eu tentei o seguinte:
w['female']['female']='1'
w['female']['male']='0'
Mas receba exatamente a mesma cópia dos resultados anteriores.
Idealmente, gostaria de obter uma saída que se assemelhe ao seguinte loop em termos de elementos.
if w['female'] =='female':
w['female'] = '1';
else:
w['female'] = '0';
Examinei a documentação das dicas ( http://pandas.pydata.org/pandas-docs/stable/gotchas.html ), mas não consigo descobrir por que nada acontece.
Qualquer ajuda será apreciada.
.loc
sintaxe para evitarSettingWithCopyWarning
: pandas.pydata.org/pandas-docs/stable/...Você pode editar um subconjunto de um quadro de dados usando loc:
Nesse caso:
fonte
Consulte os documentos pandas.DataFrame.replace () .
fonte
Leve variação:
fonte
Isso também deve funcionar:
fonte
Você também pode usar
apply
com.get
iew['female'] = w['female'].apply({'male':0, 'female':1}.get)
:Dataframe
w
:Usando
apply
para substituir valores do dicionário:Resultado:
Nota:
apply
com o dicionário deve ser usado se todos os valores possíveis das colunas no quadro de dados estiverem definidos no dicionário, ele ficará vazio para os que não estão definidos no dicionário.fonte
Isso é muito compacto:
Outro bom:
fonte
Como alternativa, há a função interna pd.get_dummies para esses tipos de atribuições:
Isso fornece um quadro de dados com duas colunas, uma para cada valor que ocorre em w ['female'], das quais você solta a primeira (porque você pode deduzi-la da que resta). A nova coluna é automaticamente nomeada como a sequência que você substituiu.
Isso é especialmente útil se você tiver variáveis categóricas com mais de dois valores possíveis. Essa função cria tantas variáveis fictícias necessárias para distinguir entre todos os casos. Cuidado para não atribuir todo o quadro de dados a uma única coluna; em vez disso, se w ['female'] puder ser 'male', 'female' ou 'neutral', faça algo assim:
Então você fica com duas novas colunas, fornecendo a codificação fictícia de 'female' e você se livrou da coluna com as strings.
fonte
Usando
Series.map
comSeries.fillna
Se sua coluna contiver mais seqüências do que apenas
female
emale
,Series.map
falhará nesse caso, pois retornaráNaN
para outros valores.É por isso que temos que acorrentá-lo com
fillna
:Exemplo por que
.map
falha :Para o método correto , encadeamos
map
comfillna
, então preenchemos osNaN
valores da coluna original:fonte
Também existe uma função
pandas
chamada,factorize
que você pode usar para executar automaticamente esse tipo de trabalho. Converte rótulos em números:['male', 'female', 'male'] -> [0, 1, 0]
. Veja esta resposta para mais informações.fonte
Eu acho que em resposta deve ser apontado que tipo de objeto você obtém em todos os métodos sugeridos acima: é Series ou DataFrame.
Quando você obtém a coluna por
w.female.
ouw[[2]]
(onde, suponha, 2 é o número da sua coluna), você recupera o DataFrame. Portanto, neste caso, você pode usar métodos do DataFrame como.replace
.Quando você usa
.loc
ouiloc
você voltar série, e série não tem.replace
método, então você deve usar métodos comoapply
,map
e assim por diante.fonte