J'ai besoin de créer un bloc de données en utilisant des données stockées dans un fichier. Pour cela, je veux utiliser read_csv
méthode. Cependant, le séparateur n'est pas très régulier. Certaines colonnes sont séparées par des onglets (\t
), les autres sont séparés par des espaces. De plus, certaines colonnes peuvent être séparées par 2 ou 3 espaces ou plus ou même par une combinaison d'espaces et de tabulations (par exemple 3 espaces, deux tabulations puis 1 espace).
Existe-t-il un moyen de dire à pandas de traiter correctement ces fichiers?
Soit dit en passant, je n'ai pas ce problème si j'utilise Python. J'utilise:
for line in file(file_name):
fld = line.split()
Et cela fonctionne parfaitement. Peu importe 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. pandas peut-il faire de même?
Depuis la documentation , vous pouvez utiliser soit une expression régulière, soit 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
>>> 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.
Pandas a deux lecteurs csv, seul est flexible en ce qui concerne les espaces blancs de tête redondants:
pd.read_csv("whitespace.csv", skipinitialspace=True)
alors qu'on n'est pas
pd.DataFrame.from_csv("whitespace.csv")
Aucun n'est prêt à l'emploi en ce qui concerne les espaces blancs à la fin, voir les réponses avec des expressions régulières. Évitez delim_whitespace, car il n'autorise que les espaces (sans ou\t) comme séparateurs.
Nous pouvons considérer que cela prend en charge toutes les combinaisons et zéro ou plusieurs occurrences.
pd.read_csv("whitespace.csv", header = None, sep = "[ \t]*,[ \t]*")