Façon de lire les premières lignes du dataframe pandas

100

Existe-t-il un moyen intégré à utiliser read_csvpour lire uniquement les premières nlignes d'un fichier sans connaître la longueur des lignes à l'avance? J'ai un gros fichier qui prend beaucoup de temps à lire, et je ne veux parfois utiliser que les 20 premières lignes, disons, pour en obtenir un échantillon (et je préfère ne pas charger le tout et en prendre la tête).

Si je connaissais le nombre total de lignes, je pourrais faire quelque chose comme footer_lines = total_lines - net passer ceci au skipfootermot - clé arg. Ma solution actuelle est de récupérer manuellement les premières nlignes avec python et StringIO pour les pandas:

import pandas as pd
from StringIO import StringIO

n = 20
with open('big_file.csv', 'r') as f:
    head = ''.join(f.readlines(n))

df = pd.read_csv(StringIO(head))

Ce n'est pas si mal, mais y a-t-il une façon plus concise, «pandasique» (?) De le faire avec des mots-clés ou quelque chose?

barbe
la source
1
Pour voir comment charger les N dernières lignes, consultez ce message SO
zelusp
7
Vouliez-vous dire «pandastic»? :)
1 ''

Réponses:

182

Je pense que vous pouvez utiliser le nrowsparamètre. À partir de la documentation :

nrows : int, default None

    Number of rows of file to read. Useful for reading pieces of large files

qui semble fonctionner. En utilisant l'un des grands fichiers de test standard (988504479 octets, 5344499 lignes):

In [1]: import pandas as pd

In [2]: time z = pd.read_csv("P00000001-ALL.csv", nrows=20)
CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
Wall time: 0.00 s

In [3]: len(z)
Out[3]: 20

In [4]: time z = pd.read_csv("P00000001-ALL.csv")
CPU times: user 27.63 s, sys: 1.92 s, total: 29.55 s
Wall time: 30.23 s
DSM
la source
Génial, a dû manquer ce paramètre. Merci.
beardc
3
skiprows=Noneest également un paramètre utile à retenir
Nitin
Quelle est la meilleure façon de charger les n dernières lignes? Fondamentalement, ce que fait tail (), mais je dois l'utiliser lors du chargement du csv. Merci d'avance!
Danail Petrov