L'option low_memory déconseillée
L' low_memory
option n'est pas correctement déconseillée, mais elle devrait l'être, car elle ne fait rien de différent [ source ]
La raison pour laquelle vous obtenez cet low_memory
avertissement est que deviner les dtypes pour chaque colonne est très gourmand en mémoire. Pandas essaie de déterminer le type de fichier à définir en analysant les données de chaque colonne.
Dtype Guessing (très mauvais)
Les pandas ne peuvent déterminer le type de dt d'une colonne qu'une fois que le fichier entier est lu. Cela signifie que rien ne peut vraiment être analysé avant la lecture de l'ensemble du fichier, sauf si vous risquez d'avoir à modifier le type de dt de cette colonne lorsque vous lisez la dernière valeur.
Prenons l'exemple d'un fichier qui a une colonne appelée user_id. Il contient 10 millions de lignes où user_id est toujours des nombres. Étant donné que les pandas ne peuvent pas savoir qu'il ne s'agit que de chiffres, ils le conserveront probablement comme les chaînes d'origine jusqu'à ce qu'il ait lu l'intégralité du fichier.
Spécification de dtypes (devrait toujours être fait)
ajouter
dtype={'user_id': int}
à l' pd.read_csv()
appel fera savoir aux pandas quand il commencera à lire le fichier, qu'il ne s'agit que d'entiers.
Il convient également de noter que si la dernière ligne du fichier avait "foobar"
écrit dans la user_id
colonne, le chargement se bloquerait si le type ci-dessus était spécifié.
Exemple de données cassées qui se cassent lorsque les dtypes sont définis
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'
Les dtypes sont généralement une chose numpy, en savoir plus à leur sujet ici:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
Quels dtypes existent?
Nous avons accès à dtypes numpy: float, int, bool, timedelta64 [ns] et datetime64 [ns]. Notez que les dtypes numpy date / time ne sont pas sensibles au fuseau horaire.
Pandas étend cet ensemble de dtypes avec les siens:
'datetime64 [ns,]' qui est un horodatage prenant en compte le fuseau horaire.
'catégorie' qui est essentiellement une énumération (chaînes représentées par des clés entières pour enregistrer
'period []' À ne pas confondre avec un timedelta, ces objets sont en fait ancrés à des périodes de temps spécifiques
'Sparse', 'Sparse [int]', 'Sparse [float]' est pour les données clairsemées ou 'Les données qui ont beaucoup de trous' Au lieu d'enregistrer le NaN ou Aucun dans la trame de données, il omet les objets, économisant de l'espace .
«Intervalle» est un sujet qui lui est propre, mais son utilisation principale est pour l'indexation. Voir plus ici
'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' sont tous des entiers spécifiques au pandas qui peuvent être annulés, contrairement à la variante numpy.
'chaîne' est un type spécifique pour travailler avec des données de chaîne et donne accès à l' .str
attribut de la série.
«booléen» est comme le «booléen» numpy mais il prend également en charge les données manquantes.
Lisez la référence complète ici:
Pandas dtype reference
Gotchas, mises en garde, notes
Le réglage dtype=object
mettra en sourdine l'avertissement ci-dessus, mais ne le rendra pas plus efficace en mémoire, il ne fera qu'effectuer un processus efficace.
Le réglage dtype=unicode
ne fera rien, car pour numpy, a unicode
est représenté par object
.
Utilisation de convertisseurs
@sparrow souligne correctement l'utilisation de convertisseurs pour éviter que les pandas explosent lorsqu'ils se rencontrent 'foobar'
dans une colonne spécifiée comme int
. Je voudrais ajouter que les convertisseurs sont vraiment lourds et inefficaces à utiliser dans les pandas et devraient être utilisés en dernier recours. En effet, le processus read_csv est un processus unique.
Les fichiers CSV peuvent être traités ligne par ligne et peuvent ainsi être traités par plusieurs convertisseurs en parallèle plus efficacement en coupant simplement le fichier en segments et en exécutant plusieurs processus, ce que les pandas ne prennent pas en charge. Mais c'est une autre histoire.