2017-03-29 2 views
1

Say I Textdatei wie unten haben:Import Textdatei mit ungleichen Spaltennummer und komplizierte Trennzeichen

apple pear banana, peach orange grape 

dog cat white horse 

salmon 

tiger lion eagle hawk monkey 

für die Ausgabe der Suche wie:

"apple", "pear", "banana", "peach orange grape" 

"dog", "cat", "white horse" 

"salmon" 

"tiger", "lion", "eagle hawk", "monkey" 

Zwei Probleme,

  1. jedes Zeile Ich möchte sie nur durch doppelten Platz trennen ''
  2. Spaltennummer von e ach Reihe könnte zufällig sein, von 1 bis 100

Wie kann ich sie in einen Pandas Datenrahmen laden?

Tatsächlich frage ich mich, ob es möglich ist, dies zu vollenden, ohne Zeile für Zeile zu lesen, weil ich Anfangs-Lösung ist:

  1. jede Zeile lesen, verwendet REX

    re.split (r '\ s {2,}', Zeile)

aufzuspalten durch Doppel Raum

  1. nach Spaltung durch Doppelraum, legen jede Zeile in DF

jedoch Coz die Spaltennummer zufällig ist, kann ich nicht einfach eine DF erzeugen, indem sie das. Das Hinzufügen von Namen = [] in pd.read_csv() behandelt ungleiche Spalten, erfordert jedoch vordefinierte Spaltennamen und -nummern.

Irgendwelche Vorschläge?

Vielen Dank!

Antwort

1

Um ein weiteres Beispiel zusätzlich zu dem einen zur Verfügung zu stellen Mit @JD Long können Sie einen regulären Ausdruck und ein Listenverständnis verwenden:

...was ergibt:

 0  1   2     3 
0 apple pear  banana peach orange grape 
1  dog cat white horse    None 
2 salmon None   None    None 
3 tiger lion eagle hawk    monkey 
+0

Oh großer Jan! In der Tat war meine ursprüngliche Lösung sehr ähnlich, aber ich habe nicht pd.DataFrame.from_records() verwendet, die ungleiche Spalten ignorieren könnte! Danke vielmals! – Windtalker

+0

@Windtalker: Ich bin froh zu helfen. – Jan

2

read_table() ist dein Freund hier ...

df = pd.read_table('./test.txt', sep=" ", header=None) 
df.to_csv('outfile.csv') 

alle fehlenden Spalten wird mit NaN gefüllt werden.

Die Textdatei test.txt oben ist die folgende:

test 2 1 
t 
t2 1 
t3 
t4 3 4 

und df sieht wie folgt aus:

 0 1 2 
0 test 2.0 1.0 
1  t NaN NaN 
2 t2 1.0 NaN 
3 t3 NaN NaN 
4 t4 3.0 4.0 

Um die Angabe in der Ausgabe erhalten Sie müssen möglicherweise die quoting Option verwenden, von csv:

import csv 
import pandas as pd 

df = pd.read_table('./test.txt', sep=" ", header=None) 
df.to_csv(quoting=csv.QUOTE_NONNUMERIC) 
+0

Dank JD. Aber es hat Fehler zurückgegeben: "ValueError: Erwartete 4 Felder in Zeile 2, sah 5. Fehler möglicherweise aufgrund von Anführungszeichen ignoriert werden, wenn ein Multi-Char-Trennzeichen verwendet wird." – Windtalker

Verwandte Themen