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
dtype={'user_id': int}
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 na user_id
coluna, o carregamento seria interrompido se o dtype acima fosse especificado.
Exemplo de dados quebrados que quebram quando os tipos são definidos
import pandas as pd
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": "string"})
ValueError: invalid literal for long() with base 10: 'foobar'
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, a unicode
é representado como object
.
Uso de conversores
@sparrow indica corretamente o uso de conversores para evitar que os pandas explodam ao encontrar 'foobar'
em uma coluna especificada como int
. 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.