115 votes

Comment rendre le séparateur dans pandas read_csv plus flexible par rapport aux espaces blancs, pour les séparateurs irréguliers ?

J'ai besoin de créer un cadre de données en lisant des données dans un fichier, en utilisant read_csv méthode. Cependant, les séparateurs ne sont pas très réguliers : certaines colonnes sont séparées par des tabulations ( \t ), d'autres sont séparés par des espaces. En outre, certaines colonnes peuvent être séparées par 2 ou 3 espaces ou plus, voire par une combinaison d'espaces et de tabulations (par exemple 3 espaces, deux tabulations, puis 1 espace).

Existe-t-il un moyen d'indiquer à pandas de traiter ces fichiers correctement ?

Au fait, je n'ai pas ce problème si j'utilise Python. J'utilise :

for line in file(file_name):
   fld = line.split()

Et ça fonctionne parfaitement. Il ne se soucie pas de savoir s'il y a 2 ou 3 espaces entre les champs. Même les combinaisons d'espaces et de tabulations ne posent aucun problème. Les pandas peuvent-ils faire de même ?

175voto

DSM Points 71975

De la documentation vous pouvez utiliser soit une expression rationnelle, soit une formule de type delim_whitespace :

>>> import pandas as pd
>>> for line in open("whitespace.csv"):
...     print repr(line)
...     
'a\t  b\tc 1 2\n'
'd\t  e\tf 3 4\n'
>>> pd.read_csv("whitespace.csv", header=None, delimiter=r"\s+")
   0  1  2  3  4
0  a  b  c  1  2
1  d  e  f  3  4
>>> pd.read_csv("whitespace.csv", header=None, delim_whitespace=True)
   0  1  2  3  4
0  a  b  c  1  2
1  d  e  f  3  4

18voto

Peaceful Points 1162
>>> pd.read_csv("whitespace.csv", header = None, sep = "\s+|\t+|\s+\t+|\t+\s+")

utiliserait n'importe quelle combinaison d'un nombre quelconque d'espaces et de tabulations comme séparateur.

4voto

Gerben Points 93

Pandas a deux lecteurs csv, le seul est flexible en ce qui concerne les espaces blancs de tête redondants :

pd.read_csv("whitespace.csv", skipinitialspace=True)

alors que l'autre ne l'est pas

pd.DataFrame.from_csv("whitespace.csv")

Ni l'une ni l'autre n'est prête à l'emploi et flexible en ce qui concerne les espaces blancs de fin de ligne, voir les réponses avec les expressions régulières. Évitez delim_whitespace, car il autorise également les espaces (sans , ni \t ) comme séparateurs.

2voto

yoonghm Points 1213

Nous pouvons considérer que cela prend en charge toutes les combinaisons et les occurrences zéro ou plus.

pd.read_csv("whitespace.csv", header = None, sep = "[ \t]*,[ \t]*")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X