Ao ligar
df = pd.read_csv('somefile.csv')
Eu recebo:
/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/io/parsers.py:1130: DtypeWarning: colunas (4,5,7,16) têm tipos mistos. Especifique a opção dtype na importação ou defina low_memory = False.
Por que a dtype
opção está relacionada low_memory
e por que a False
ajudaria com esse problema?
Respostas:
A opção low_memory obsoleta
A
low_memory
opção não foi descontinuada adequadamente, mas deveria ser, pois na verdade não faz nada de diferente [ fonte ]A razão pela qual você recebe esse
low_memory
aviso é porque adivinhar os tipos de cada coluna exige muita memória. O Pandas tenta determinar que tipo de tipo definir, analisando os dados em cada coluna.Adivinhação de tipo (muito ruim)
O Pandas pode apenas determinar qual o tipo de coluna que uma coluna deve ter depois que todo o arquivo for lido. Isso significa que nada pode realmente ser analisado antes que o arquivo inteiro seja lido, a menos que você corra o risco de alterar o tipo dessa coluna quando ler o último valor.
Considere o exemplo de um arquivo que possui uma coluna chamada user_id. Ele contém 10 milhões de linhas em que o user_id é sempre números. Como os pandas não podem saber que são apenas números, provavelmente os manterão como as strings originais até ler o arquivo inteiro.
Especificando tipos (sempre deve ser feito)
adicionando
Ao fazer a
pd.read_csv()
chamada, os pandas saberão quando começar a ler o arquivo, que isso é apenas números inteiros.Também digno de nota é que, se a última linha do arquivo tivesse sido
"foobar"
escrita nauser_id
coluna, o carregamento seria interrompido se o dtype acima fosse especificado.Exemplo de dados quebrados que quebram quando os tipos são definidos
Normalmente, os dtypes são um problema, leia mais sobre eles aqui: http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
Quais tipos existem?
Temos acesso a tipos numpy: float, int, bool, timedelta64 [ns] e datetime64 [ns]. Observe que os tipos de data / hora numpy não reconhecem o fuso horário.
O Pandas estende esse conjunto de tipos com seus próprios:
'datetime64 [ns,]' Que é um carimbo de data / hora com reconhecimento de fuso horário.
'categoria', que é essencialmente uma enumeração (cadeias representadas por chaves inteiras para salvar
'período []' Para não ser confundido com um intervalo de tempo, esses objetos são realmente ancorados a períodos específicos
'Esparso', 'Esparso [int]', 'Esparso [flutuante]' é para dados esparsos ou 'Dados com muitos buracos'. Em vez de salvar NaN ou Nenhum no quadro de dados, ele omite os objetos, economizando espaço .
'Intervalo' é um tópico próprio, mas seu principal uso é para indexação. Veja mais aqui
'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' são todos números inteiros específicos de pandas que são anuláveis, diferentemente da variante numpy.
'string' é um dtype específico para trabalhar com dados de string e fornece acesso ao
.str
atributo na série.'boolean' é como o numpy 'bool', mas também suporta dados ausentes.
Leia a referência completa aqui:
Referência de tipo de pandas
Pegadinhas, ressalvas, notas
A configuração
dtype=object
silenciará o aviso acima, mas não o tornará mais eficiente em memória, apenas processará se houver alguma coisa.A configuração
dtype=unicode
não fará nada, pois, para numpy, aunicode
é representado comoobject
.Uso de conversores
@sparrow indica corretamente o uso de conversores para evitar que os pandas explodam ao encontrar
'foobar'
em uma coluna especificada comoint
. Gostaria de acrescentar que os conversores são realmente pesados e ineficientes para uso em pandas e devem ser usados como último recurso. Isso ocorre porque o processo read_csv é um processo único.Os arquivos CSV podem ser processados linha a linha e, portanto, podem ser processados por vários conversores em paralelo com mais eficiência, simplesmente cortando o arquivo em segmentos e executando vários processos, algo que o pandas não suporta. Mas esta é uma história diferente.
fonte
dtype=object
não é mais eficiente em termos de memória, há alguma razão para mexer com isso além de se livrar do erro?error_bad_lines=False, warn_bad_lines=True
deve fazer o truque. A documentação diz que é válida apenas com o analisador C. Ele também diz que o analisador padrão é Nenhum, o que dificulta saber qual é o padrão.nrows=100
como argumento e, em seguida,df.dtypes
ver os tipos que obtém. No entanto, ao ler todo o quadro de dados com esses tipos, certifique-se de fazer umtry/except
procedimento para detectar palpites de tipos defeituosos. Os dados estão sujos, você sabe.Experimentar:
De acordo com a documentação dos pandas:
Quanto a low_memory, é True por padrão e ainda não está documentado. Eu não acho que seja relevante. A mensagem de erro é genérica, portanto você não precisa mexer com a memória baixa de qualquer maneira. Espero que isso ajude e deixe-me saber se você tiver mais problemas
fonte
dtype=unicode
produzido:NameError: name 'unicode' is not defined
. Mas colocarunicode
aspas (como em 'unicode') parece funcionar!numpy.dtype('unicode')
. Quando você atribui à opção dtype uma string, ela tenta convertê-la nanumpy.dtype()
fábrica por padrão. A especificação'unicode'
não fará nada, os unicodes são apenas otimizadosobjects
. Você receberádtype='object'
Isso deve resolver o problema. Recebi exatamente o mesmo erro ao ler 1,8 milhão de linhas de um CSV.
fonte
Conforme mencionado anteriormente pelo firelynx, se o dtype for especificado explicitamente e houver dados mistos que não sejam compatíveis com esse tipo, o carregamento será interrompido. Usei um conversor como este como solução alternativa para alterar os valores com tipo de dados incompatível, para que os dados ainda pudessem ser carregados.
fonte
Eu tive um problema semelhante com um arquivo de ~ 400 MB. Definir
low_memory=False
fez o truque para mim. Faça as coisas simples primeiro, eu verificaria se o seu quadro de dados não é maior que a memória do sistema, reinicie, limpe a RAM antes de continuar. Se você ainda estiver com erros, vale a pena garantir que seu.csv
arquivo esteja correto, dê uma olhada rápida no Excel e verifique se não há corrupção óbvia. Dados originais quebrados podem causar estragos ...fonte
Eu estava enfrentando um problema semelhante ao processar um enorme arquivo csv (6 milhões de linhas). Eu tive três problemas: 1. o arquivo continha caracteres estranhos (corrigidos usando a codificação) 2. o tipo de dados não foi especificado (corrigido usando a propriedade dtype) definido com base no nome do arquivo (corrigido usando try .. exceto ..)
fonte
Funcionou para mim
low_memory = False
durante a importação de um DataFrame. Essa é toda a mudança que funcionou para mim:fonte