J'ai un fichier csv qui ne vient pas correctement pandas.read_csv
lorsque je filtre les colonnes avec usecols
et que j'utilise plusieurs index.
import pandas as pd
csv = r"""dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5"""
f = open('foo.csv', 'w')
f.write(csv)
f.close()
df1 = pd.read_csv('foo.csv',
header=0,
names=["dummy", "date", "loc", "x"],
index_col=["date", "loc"],
usecols=["dummy", "date", "loc", "x"],
parse_dates=["date"])
print df1
# Ignore the dummy columns
df2 = pd.read_csv('foo.csv',
index_col=["date", "loc"],
usecols=["date", "loc", "x"], # <----------- Changed
parse_dates=["date"],
header=0,
names=["dummy", "date", "loc", "x"])
print df2
Je m'attends à ce que df1 et df2 soient identiques, sauf pour la colonne factice manquante, mais les colonnes sont mal étiquetées. De plus, la date est analysée comme une date.
In [118]: %run test.py
dummy x
date loc
2009-01-01 a bar 1
2009-01-02 a bar 3
2009-01-03 a bar 5
2009-01-01 b bar 1
2009-01-02 b bar 3
2009-01-03 b bar 5
date
date loc
a 1 20090101
3 20090102
5 20090103
b 1 20090101
3 20090102
5 20090103
L'utilisation de numéros de colonne au lieu de noms me pose le même problème. Je peux contourner le problème en supprimant la colonne factice après l'étape read_csv, mais j'essaie de comprendre ce qui ne va pas. J'utilise pandas 0.10.1.
edit: correction d'une mauvaise utilisation de l'en-tête.
python
pandas
csv
csv-import
puce
la source
la source
header
etnames
n'est pas correcte (c'est pourquoi la première ligne est manquante dans votre exemple.header
Attend un int (0 par défaut) comme ligne avec l'en-tête. Parce que vous donnez "True" qui est interprété comme 1, la deuxième ligne (première ligne de données) est utilisée comme en-tête et est manquante. Cependant, les noms de colonnes sont corrects car vous les écrasez avec l'names
argument. Mais vous pouvez les laisser tous les deux et la première ligne est utilisée par défaut pour les noms de colonnes. Cependant, cela ne résout pas votre question initiale.usecols
bug. Peut-être lié au bogue 2654 ?Réponses:
La réponse de @chip manque complètement le point de deux arguments de mot-clé.
Cette solution corrige ces bizarreries:
Ce qui nous donne:
la source
header=0
. Vous voudriez utiliserheader=None
puis utilisernames
en plus.usecols
avec des index entiers pour les colonnes que l'on veut garder @Mack?Ce code réalise ce que vous voulez - aussi c'est bizarre et certainement bogué:
J'ai observé que ça marche quand:
a) vous spécifiez le
index_col
rel. au nombre de colonnes que vous utilisez vraiment - donc ses trois colonnes dans cet exemple, pas quatre (vous déposezdummy
et commencez à compter à partir de là)b) idem pour
parse_dates
c) pas le cas
usecols
;) pour des raisons évidentesd) ici j'ai adapté le
names
pour refléter ce comportementqui imprime
la source
names
nombres et en fonction deusecols
sorte que les données soient correctes.Si votre fichier csv contient des données supplémentaires, les colonnes peuvent être supprimées du DataFrame après l'importation.
Ce qui nous donne:
la source
Vous devez simplement ajouter le
index_col=False
paramètrela source
importez d'abord csv et utilisez csv.DictReader, c'est facile à traiter ...
la source