2014-10-24 8 views
8

Mam pewne dane, które wygląda tak:import tekstu pandy z wieloma ogranicznikami

c stuff 
c more header 
c begin data   
1 1:.5 
1 2:6.5 
1 3:5.3 

Chcę zaimportować je do danych ramy 3 kolumny, z kolumnami np

a , b, c 
1, 1, 0.5 
etc 

I zostały próby odczytu w danych jako podzielony na 2 kolumny „:”, a następnie podzielić pierwszej kolumnie „”. Jednak uważam to za irytujące. Czy istnieje lepszy sposób na posortowanie go na import bezpośrednio?

obecnie:

data1 = pd.read_csv(file_loc, skiprows = 3, delimiter = ':', names = ['AB', 'C']) 
data2 = pd.DataFrame(data1.AB.str.split(' ',1).tolist(), names = ['A','B']) 

Jednak to dodatkowo komplikuje fakt, moje dane ma wiodącą przestrzeń ...

czuję jak to powinno być proste zadanie, ale obecnie myślę odczytywania linii po linii i korzystania z funkcji Znajdź zastępcę w celu oczyszczenia danych przed ich zaimportowaniem.

Odpowiedz

19

Jednym ze sposobów może być użycie separatorów regex dozwolonych przez silnik Pythona. Na przykład:

>>> !cat castle.dat 
c stuff 
c more header 
c begin data   
1 1:.5 
1 2:6.5 
1 3:5.3 
>>> df = pd.read_csv('castle.dat', skiprows=3, names=['a', 'b', 'c'], 
        sep=' |:', engine='python') 
>>> df 
    a b c 
0 1 1 0.5 
1 1 2 6.5 
2 1 3 5.3 
+0

Wygląda dokładnie tak, jak potrzebowałem. Dzięki – CastleH

+0

Czuję się trochę zażenowany, nie zauważając argumentu "sep" w dokumentacji teraz ...: -/ – CastleH

+0

Dlaczego otrzymuję 'ParserError' kiedy używam tej metody? 'pandas.errors.ParserError: Oczekiwano 29 pól w linii 11, zobaczyłem 45. Błąd mógł być prawdopodobnie spowodowany ignorowaniem cudzysłowów, gdy używany jest ogranicznik wielu znaków." – user77005

Powiązane problemy