Importer un fichier CSV en tant que DataFrame pandas

91

Quelle est la façon Python de lire un fichier CSV dans un DataFrame pandas (que je peux ensuite utiliser pour des opérations statistiques, peut avoir des colonnes de types différents, etc.)?

Mon fichier CSV "value.txt"a le contenu suivant:

Date,"price","factor_1","factor_2"
2012-06-11,1600.20,1.255,1.548
2012-06-12,1610.02,1.258,1.554
2012-06-13,1618.07,1.249,1.552
2012-06-14,1624.40,1.253,1.556
2012-06-15,1626.15,1.258,1.552
2012-06-16,1626.15,1.263,1.558
2012-06-17,1626.15,1.264,1.572

Dans R, nous lirions ce fichier en utilisant:

price <- read.csv("value.txt")  

et cela renverrait un R data.frame:

> price <- read.csv("value.txt")
> price
     Date   price factor_1 factor_2
1  2012-06-11 1600.20    1.255    1.548
2  2012-06-12 1610.02    1.258    1.554
3  2012-06-13 1618.07    1.249    1.552
4  2012-06-14 1624.40    1.253    1.556
5  2012-06-15 1626.15    1.258    1.552
6  2012-06-16 1626.15    1.263    1.558
7  2012-06-17 1626.15    1.264    1.572

Existe-t-il un moyen pythonique d'obtenir la même fonctionnalité?

Mazlor
la source
allez-vous féliciter pour ce qui est spécial avec dataframe et quelle opération statistique pouvez-vous en faire?
LWZ
3
dataframe is peut contenir plusieurs types de données, par exemple chaque colonne peut être une liste, et vous pouvez traiter chaque liste individuellement en appliquant certaines fonctions dessus et en parlant d'opérations statistiques, comme avoir la moyenne, l'écart type, le quartile,. ..
mazlor
Merci! Cela m'est en fait très utile. J'ai toujours chargé le fichier csv avec le module csv qui me donne une liste de listes. Ce data.frame sonne bien mieux!
LWZ
@LWZ: voir mes modifications et mon lien, lmk si cela répond succinctement à vos questions. C'est tout ce que nous pouvons faire ici pour «vendre» l'ensemble des avantages. La question plus large "Quels sont les avantages d'utiliser un dataframe pandas sur un tableau / liste de liste Python?" a de nombreux avantages, beaucoup trop pour les énumérer ici ...
smci

Réponses:

160

pandas à la rescousse:

import pandas as pd
print pd.read_csv('value.txt')

        Date    price  factor_1  factor_2
0  2012-06-11  1600.20     1.255     1.548
1  2012-06-12  1610.02     1.258     1.554
2  2012-06-13  1618.07     1.249     1.552
3  2012-06-14  1624.40     1.253     1.556
4  2012-06-15  1626.15     1.258     1.552
5  2012-06-16  1626.15     1.263     1.558
6  2012-06-17  1626.15     1.264     1.572

Cela renvoie pandas DataFrame qui est similaire à R's.

racine
la source
10

Pour lire un fichier CSV en tant que DataFrame pandas, vous devrez utiliser pd.read_csv.

Mais ce n'est pas là que l'histoire se termine; les données existent dans de nombreux formats différents et sont stockées de différentes manières, vous devrez donc souvent passer des paramètres supplémentaires pour read_csvvous assurer que vos données sont lues correctement.

Voici un tableau répertoriant les scénarios courants rencontrés avec les fichiers CSV ainsi que l'argument approprié que vous devrez utiliser. Vous aurez généralement besoin de tout ou partie des combinaisons des arguments ci-dessous pour lire vos données.

┌──────────────────────────────────────────────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────┐
│  ScenarioArgumentExample                                               │
├──────────────────────────────────────────────────────────┼─────────────────────────────┼────────────────────────────────────────────────────────┤
│  Read CSV with different separator¹                      │  sep/delimiter              │  read_csv(..., sep=';')                                │
│  Read CSV with tab/whitespace separator                  │  delim_whitespace           │  read_csv(..., delim_whitespace=True)                  │
│  Fix UnicodeDecodeError while reading²                   │  encoding                   │  read_csv(..., encoding='latin-1')                     │
│  Read CSV without headers³                               │  header and names           │  read_csv(..., header=False, names=['x', 'y', 'z'])    │
│  Specify which column to set as the index⁴               │  index_col                  │  read_csv(..., index_col=[0])                          │
│  Read subset of columns                                  │  usecols                    │  read_csv(..., usecols=['x', 'y'])                     │
│  Numeric data is in European format (eg., 1.234,56)      │  thousands and decimal      │  read_csv(..., thousands='.', decimal=',')             │
└──────────────────────────────────────────────────────────┴─────────────────────────────┴────────────────────────────────────────────────────────┘

Notes de bas de page

  1. Par défaut, read_csvutilise un moteur d'analyse syntaxique C pour les performances. L'analyseur C ne peut gérer que des séparateurs de caractères uniques. Si votre CSV a un séparateur à plusieurs caractères, vous devrez modifier votre code pour utiliser le 'python'moteur. Vous pouvez également transmettre des expressions régulières:

    df = pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
    
  2. UnicodeDecodeErrorse produit lorsque les données ont été stockées dans un format d'encodage mais lues dans un format différent et incompatible. Les schémas de codage les plus courants sont 'utf-8'et 'latin-1', vos données sont susceptibles de s'intégrer dans l'un d'entre eux.

  3. header=Falsespécifie que la première ligne du CSV est une ligne de données plutôt qu'une ligne d'en-tête et names=[...]vous permet de spécifier une liste de noms de colonne à affecter au DataFrame lors de sa création.

  4. «Sans nom: 0» se produit lorsqu'un DataFrame avec un index sans nom est enregistré au format CSV, puis relu après. Au lieu d'avoir à résoudre le problème lors de la lecture, vous pouvez également résoudre le problème lors de l'écriture en utilisant

    df.to_csv(..., index=False)
    

Il y a d'autres arguments que je n'ai pas mentionnés ici, mais ce sont ceux que vous rencontrerez le plus fréquemment.

cs95
la source
1
Pouvez-vous s'il vous plaît recoller / reformater le tableau en tant qu'image en texte Unicode en utilisant par exemple ozh.github.io/ascii-tables ? Sinon, il est difficile à lire et ne sera pas indexé pour la recherche de contenu, ni trouvable avec une ancienne recherche de texte Ctrl-F.
smci
@smci Je suis d'accord avec ce que vous avez dit à propos de l'indexation (en plus du fait que les images ne peuvent pas être éditées par d'autres personnes) mais cela n'a pas l'air aussi bon et nécessite un défilement, ce qui le rend difficile à suivre.
cs95
de toute façon, vous devez le réécrire pour qu'il soit convivial pour un nouvel utilisateur; au lieu de trucs incompréhensibles comme «éviter» Sans nom: 0 «« il devrait dire quelque chose d'anglais clair comme « index_col: dites aux pandas quelle (s) colonne (s) utiliser comme index pour votre dataframe»
smci
@smci On dirait que les tableaux ASCII ne jouent pas bien avec les exposants - cela gâche le formatage des tableaux.
cs95
cs95: J'ai recommandé Unicode, pas ASCII. Unicode fonctionne très bien. Il suffit donc de changer la valeur par défaut dans la liste déroulante sur ozh.github.io/ascii-tables
smci
9

Voici une alternative à la bibliothèque pandas utilisant le module csv intégré de Python .

import csv
from pprint import pprint
with open('foo.csv', 'rb') as f:
    reader = csv.reader(f)
    headers = reader.next()
    column = {h:[] for h in headers}
    for row in reader:
        for h, v in zip(headers, row):
            column[h].append(v)
    pprint(column)    # Pretty printer

va imprimer

{'Date': ['2012-06-11',
          '2012-06-12',
          '2012-06-13',
          '2012-06-14',
          '2012-06-15',
          '2012-06-16',
          '2012-06-17'],
 'factor_1': ['1.255', '1.258', '1.249', '1.253', '1.258', '1.263', '1.264'],
 'factor_2': ['1.548', '1.554', '1.552', '1.556', '1.552', '1.558', '1.572'],
 'price': ['1600.20',
           '1610.02',
           '1618.07',
           '1624.40',
           '1626.15',
           '1626.15',
           '1626.15']}
sidi
la source
6
import pandas as pd
df = pd.read_csv('/PathToFile.txt', sep = ',')

Cela importera votre fichier .txt ou .csv dans un DataFrame.

Rishabh
la source
1
%cd C:\Users\asus\Desktop\python
import pandas as pd
df = pd.read_csv('value.txt')
df.head()
    Date    price   factor_1    factor_2
0   2012-06-11  1600.20 1.255   1.548
1   2012-06-12  1610.02 1.258   1.554
2   2012-06-13  1618.07 1.249   1.552
3   2012-06-14  1624.40 1.253   1.556
4   2012-06-15  1626.15 1.258   1.552
chahat
la source
0

Vous pouvez utiliser le module csv présent dans la bibliothèque standard python pour manipuler les fichiers CSV.

exemple:

import csv
with open('some.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row
KurzedMétal
la source
-0. Venant de R, mazlor ne chercherait pas le csvmodule car son niveau est trop bas. pandasfournit le niveau d'abstraction demandé.
Steven Rumbalski le
... en plus, il lit les données dans un objet Python utile tel qu'un tableau numpy ...
Paul Hiemstra
0

importer des pandas en tant que
jeu de données pd = pd.read_csv ('/ home / nspython / Downloads / movie_metadata1.csv')

ns_piumal
la source
-1

Remarque tout aussi propre, mais:

import csv

with open("value.txt", "r") as f:
    csv_reader = reader(f)
    num = '  '
    for row in csv_reader:
        print num, '\t'.join(row)
        if num == '  ':  
            num=0
        num=num+1

Pas aussi compact, mais il fait le travail:

   Date price   factor_1    factor_2
1 2012-06-11    1600.20 1.255   1.548
2 2012-06-12    1610.02 1.258   1.554
3 2012-06-13    1618.07 1.249   1.552
4 2012-06-14    1624.40 1.253   1.556
5 2012-06-15    1626.15 1.258   1.552
6 2012-06-16    1626.15 1.263   1.558
7 2012-06-17    1626.15 1.264   1.572
Lee-Man
la source
1
Cela ne répond pas à la question de l'OP car il ne lit pas les données csv dans un objet Python.
Paul Hiemstra
peut-être remplacer le num par enumerate dans la boucle for?
LWZ
@PaulHiemstra, OP n'a pas mentionné "objet", mais a demandé de la facilité. Pourtant, je soupçonne que l'approche «pandas» correspond mieux à ce qui était demandé.
Lee-Man