Quel est le moyen Python de lire un fichier CSV dans un pandas DataFrame (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
En 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 les mêmes fonctionnalités?
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
Ceci retourne pandas DataFrame qui est similaire à R's
.
Voici une alternative à la bibliothèque pandas utilisant la version intégrée de Python module csv .
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
imprimera
{'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']}
Pour lire un fichier CSV en tant que pandas DataFrame, vous devez 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 à read_csv
pour vous 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é à utiliser. Vous aurez généralement besoin de l’ensemble ou d’une combinaison des arguments ci-dessous pour lire les données votre.
┌──────────────────────────────────────────────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────┐
│ Scenario │ Argument │ Example │
├──────────────────────────────────────────────────────────┼─────────────────────────────┼────────────────────────────────────────────────────────┤
│ 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
Par défaut,
read_csv
Utilise un moteur d'analyse C pour la performance. L'analyseur C ne peut gérer que des séparateurs à un seul caractère. Si votre CSV comporte un séparateur de plusieurs caractères, vous devrez modifier votre code pour utiliser le moteur'python'
. Vous pouvez également passer des expressions régulières:df = pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
UnicodeDecodeError
se produit lorsque les données ont été stockées dans un format de codage 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 vont probablement s'intégrer à l'un d'entre eux.
header=False
Spécifie que la première ligne du fichier CSV est une ligne de données plutôt qu'une ligne d'en-tête, et lenames=[...]
Vous permet de spécifier une liste de noms de colonnes à affecter au DataFrame lors de sa création. ."Sans nom: 0" se produit lorsqu'un DataFrame avec un index non nommé est enregistré au format CSV, puis relu après. Au lieu de devoir résoudre le problème pendant la lecture, vous pouvez également résoudre le problème lors de l'écriture en utilisant
df.to_csv(..., index=False)
Il n’ya pas d’autres arguments que je n’ai pas mentionnés ici, mais ce sont ceux que vous rencontrerez le plus souvent.
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