2013-02-22 18 views
34

Potrzebuję utworzyć ramkę danych przy użyciu danych przechowywanych w pliku. Do tego chcę użyć metody read_csv. Jednak separator nie jest bardzo regularny. Niektóre kolumny są oddzielone tabulatorami (\t), inne są oddzielone spacjami. Co więcej, niektóre kolumny mogą być oddzielone 2 lub 3 lub więcej spacjami lub nawet kombinacją spacji i tabulacji (na przykład 3 spacje, dwie tabulatory i 1 spacja).Jak uczynić separator w read_csv bardziej elastyczną białą spacją?

Czy istnieje sposób, aby powiedzieć pandom, aby traktować te pliki poprawnie?

Nawiasem mówiąc, nie mam tego problemu, jeśli używam Pythona. Używam:

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

I działa idealnie. Nie ma znaczenia, czy między polami są 2 lub 3 spacje. Nawet kombinacje spacji i zakładek nie powodują żadnych problemów. Czy pandy mogą zrobić to samo?

Odpowiedz

58

Z documentation, można użyć regex lub 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 
+1

Możesz także użyć 'skipinitialspace' aby pominąć początkową przestrzeń – jarondl

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

byłoby użyć dowolnej kombinacji dowolnej liczbie pomieszczeń i kartami jak separatora.

0

Możemy to rozważyć, aby zająć się całą kombinacją i zerem lub większą liczbą zdarzeń.

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

Pandy ma dwa czytniki csv, tylko jest elastyczne czasowo zbędne wiodącej białej przestrzeni:

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

natomiast nie jest

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

Ani jest out-of-the-box elastyczny dotyczące kończącej się białej przestrzeni, zobacz odpowiedzi za pomocą wyrażeń regularnych. Unikaj delim_whitespace, ponieważ pozwala również na spacje (bez lub \ t) jako separatory.

Powiązane problemy