web-dev-qa-db-fra.com

Empêcher pandas read_csv de traiter la première ligne comme en-tête des noms de colonne

Je lis un pandas DataFrame En utilisant pd.read_csv. Je veux conserver la première ligne en tant que données, mais elle continue d'être convertie en noms de colonne.

  • J'ai essayé header=False Mais cela vient de le supprimer entièrement.

(Remarque sur mes données d'entrée: j'ai une chaîne (st = '\n'.join(lst)) que je convertis en un objet de type fichier (io.StringIO(st)), puis je construis le csv à partir de cela objet fichier.)

10
R.M.

Tu veux header=None le False obtient le type promu en int en 0 voir le docs accent sur le mien:

en-tête: int ou liste d'entiers, "infer" par défaut numéro (s) de ligne à utiliser comme noms de colonne, et début des données. Le comportement par défaut est comme défini sur 0 si aucun nom n'est transmis, sinon Aucun . Passez explicitement header = 0 pour pouvoir remplacer les noms existants. L'en-tête peut être une liste d'entiers qui spécifient des emplacements de ligne pour un multi-index sur les colonnes, par ex. [0,1,3]. Les lignes intermédiaires non spécifiées seront ignorées (par exemple, 2 dans cet exemple sont ignorées). Notez que ce paramètre ignore les lignes commentées et les lignes vides si skip_blank_lines = True, donc header = 0 désigne la première ligne de données plutôt que la première ligne du fichier.

Vous pouvez voir la différence de comportement, d'abord avec header=0:

In [95]:
import io
import pandas as pd
t="""a,b,c
0,1,2
3,4,5"""
pd.read_csv(io.StringIO(t), header=0)

Out[95]:
   a  b  c
0  0  1  2
1  3  4  5

Maintenant avec None:

In [96]:
pd.read_csv(io.StringIO(t), header=None)

Out[96]:
   0  1  2
0  a  b  c
1  0  1  2
2  3  4  5

Notez que dans la dernière version 0.19.1, cela va maintenant générer un TypeError:

In [98]:
pd.read_csv(io.StringIO(t), header=False)

TypeError: la transmission d'un booléen à l'en-tête n'est pas valide. Utilisez header = None pour aucun en-tête ou header = int ou une liste de caractères pour indiquer la ou les lignes constituant les noms de colonne

17
EdChum

Je pense que vous avez besoin du paramètre header=None à read_csv :

Échantillon:

import pandas as pd
from pandas.compat import StringIO

temp=u"""a,b
2,1
1,1"""

df = pd.read_csv(StringIO(temp),header=None)
print (df)
   0  1
0  a  b
1  2  1
2  1  1
6
jezrael