Ich muss einen Datenrahmen erstellen, indem ich Daten aus einer Datei mit der read_csv
Methode einlese. Die Trennzeichen sind jedoch nicht sehr regelmäßig: Einige Spalten sind durch Tabulatoren ( \t
) getrennt, andere durch Leerzeichen. Darüber hinaus können einige Spalten durch 2 oder 3 oder mehr Leerzeichen oder sogar durch eine Kombination von Leerzeichen und Tabulatoren getrennt werden (z. B. 3 Leerzeichen, zwei Tabulatoren und dann 1 Leerzeichen).
Gibt es eine Möglichkeit, Pandas anzuweisen, diese Dateien richtig zu behandeln?
Übrigens habe ich dieses Problem nicht, wenn ich Python verwende. Ich benutze:
for line in file(file_name):
fld = line.split()
Und es funktioniert perfekt. Es ist egal, ob zwischen den Feldern 2 oder 3 Leerzeichen stehen. Selbst Kombinationen von Leerzeichen und Tabulatoren verursachen keine Probleme. Können Pandas dasselbe tun?
skipinitialspace
, um das anfängliche Leerzeichen zu überspringentxt.file
und das Format habe, dass ich eine Nummer gefolgt von mindestens zwei Leerzeichen habe? Die Formeldelimiter=r"\d\d\s\s+
funktioniert nicht\s+
oder\s{2,}
. Fügen Sie\d\d
dem Trennzeichen keinen Ausdruck für das Feld hinzu ! Trennzeichen ist nur das Trennzeichen! Feld ist alles zwischen Trennzeichen (oder Anführungszeichen).>>> pd.read_csv("whitespace.csv", header = None, sep = "\s+|\t+|\s+\t+|\t+\s+")
würde eine beliebige Kombination von beliebig vielen Leerzeichen und Tabulatoren als Trennzeichen verwenden.
quelle
Pandas hat zwei CSV-Reader und ist nur in Bezug auf redundante führende Leerzeichen flexibel:
pd.read_csv("whitespace.csv", skipinitialspace=True)
während man nicht ist
pd.DataFrame.from_csv("whitespace.csv")
Weder ist Out-of-the-Box flexibel in Bezug auf nachgestellte Leerzeichen, siehe die Antworten mit regulären Ausdrücken. Vermeiden Sie delim_whitespace, da nur Leerzeichen (ohne oder \ t) als Trennzeichen zugelassen werden.
quelle
Wir können dies in Betracht ziehen, um alle Kombinationen und null oder mehr Vorkommen zu berücksichtigen.
pd.read_csv("whitespace.csv", header = None, sep = "[ \t]*,[ \t]*")
quelle