Eu estou tentando escrever um quadro de dados do Pandas (ou pode usar uma matriz numpy) em um banco de dados mysql usando o MysqlDB. O MysqlDB não parece entender 'nan' e meu banco de dados gera um erro dizendo que nan não está na lista de campos. Preciso encontrar uma maneira de converter o 'nan' em um NoneType.
Alguma ideia?
python
pandas
numpy
mysql-python
Rishi
fonte
fonte
None
emNULL
vez denan
?Respostas:
O @bogatron está certo, você pode usar
where
, vale a pena notar que você pode fazer isso nativamente nos pandas:Nota: isso altera o tipo de todas as colunas para
object
.Exemplo:
Nota: o que você não pode fazer reformula os DataFrames
dtype
para permitir todos os tipos de tipos de dados, usandoastype
e, em seguida, ofillna
método DataFrame :Infelizmente nem este, nem usar
replace
, funciona comNone
ver esta questão (fechado) .Como um aparte, vale a pena notar que, para a maioria dos casos de uso, você não precisa substituir o NaN por Nenhum, consulte esta pergunta sobre a diferença entre NaN e Nenhum nos pandas .
No entanto, neste caso específico, parece que você faz (pelo menos no momento desta resposta).
fonte
np.nan
ser convertido para string"nan"
dtype
deobject
e fazê-lo para aqueles e lidar com outros tipos de forma diferente, conforme necessário. Idealmente,fillna(None)
seria fantástico.O crédito é para esse cara aqui nesta questão do Github .
fonte
df.replace({np.nan: None})
como um objeto temporárioVocê pode substituir
nan
porNone
em sua matriz numpy:fonte
dtype
,x.dtype
édtype('float64')
, enquantoy.dtype
édtype('object')
.Depois de tropeçar, isso funcionou para mim:
fonte
Apenas uma adição à resposta de @Andy Hayden:
Como
DataFrame.mask
é o gêmeo oposto deDataFrame.where
, eles têm exatamente a mesma assinatura, mas com significado oposto:DataFrame.where
é útil para substituir valores em que a condição é falsa .DataFrame.mask
é usado para Substituir valores em que a condição é True .Portanto, nesta questão, o uso
df.mask(df.isna(), other=None, inplace=True)
pode ser mais intuitivo.fonte
Outra adição: tenha cuidado ao substituir múltiplos e converter o tipo da coluna de volta ao objeto para flutuar . Se você quiser ter certeza de que o seu
None
não voltará paranp.NaN
a sugestão de @ andy-hayden de usarpd.where
. Ilustração de como a substituição ainda pode dar errado:fonte
.replace({np.nan: None})
replace({np.nan: None})
. Meu comentário foi adicionado para apontar a possível armadilha ao substituirnp.nan
's. O exposto certamente me tropeçou um pouco!Muito velho, mas me deparei com o mesmo problema. Tente fazer isso:
fonte