2017-04-17 6 views
0

Neu bei Pandas hier. Ich habe einen Pandas DataFrame namens all_invoice mit nur einer Spalte namens 'whole_line'.Rufen Sie die pandas Series apply-Funktion mit read_fwf auf

Jede Zeile in all_invoice ist eine Zeichenfolge mit fester Breite. Ich brauche einen neuen DataFrame von all_invoice mit read_fwf. Ich habe eine funktionierende Lösung, die wie folgt aussieht:

invoice = pd.DataFrame() 
for i,r in all_invoice['whole_line'].iteritems(): 
    temp_df = pd.read_fwf(StringIO(r), colspecs=in_specs, 
          names=in_cols, converters=in_convert) 
    invoice = invoice.append(temp_df, ignore_index = True) 

in_specs, in_cols und in_convert haben früher in meinem Skript definiert.

So funktioniert diese Lösung aber ist sehr langsam. Bei 18K Zeilen mit 85 Spalten dauert die Ausführung dieses Teils des Codes etwa 6 Minuten. Ich hoffe auf eine elegantere Lösung, bei der nicht über die Zeilen im DataFrame oder in der Serie iteriert wird und die Apply-Funktion verwendet wird, um read_fwf aufzurufen, um dies schneller zu machen. Also habe ich versucht:

invoice = all_invoice['whole_line'].apply(pd.read_fwf, colspecs=in_specs,names=in_cols, converters=in_convert) 

Der Schwanz Ende meiner Zurückverfolgungs wie folgt aussieht:

OSError: [Errno 36] File name too long: 

Im Anschluss daran Kolon die Zeichenfolge, die die read_fwf Methode übergeben wird. Ich vermute, dass dies passiert, weil read_fwf einen Dateipfad oder Puffer benötigt. In meinem funktionierenden (aber langsamen) Code kann ich StringIO() auf der Zeichenkette aufrufen, um es zu einem Puffer zu machen, aber ich kann das nicht mit der Anwendungsfunktion tun. Jegliche Hilfe, um die Anwendung zu erhalten, oder eine andere Möglichkeit, read_fwf für die gesamte Serie/df gleichzeitig zu verwenden, um das Iterieren über die Zeilen zu vermeiden, wird geschätzt. Vielen Dank.

+0

Können Sie diese Spalte nicht in einer Datei speichern und dann einen einzigen 'read_fwf' Anruf verwenden, um alle Zeilen auf einmal zu lesen? – gereleth

+0

Ich werde lieber nicht eine Datei vor dem Read_fwf auf die Festplatte schreiben. Danke für das Vorschlagen. – okyere

Antwort

0

Haben Sie versucht gerade tun:

invoice = pd.read_fwf(filename, colspecs=in_specs, 
         names=in_cols, converters=in_convert) 
+0

Ich habe keine Datei als Eingabe. Stattdessen werden die Zeilen in der Originaldatei in meinem Eingabedatenfeld gespeichert. – okyere

+0

Haben Sie die Datei, aus der all_invoice erstellt wurde? – Grr

+0

Haben Sie die Datei, aber es hat 3 verschiedene Arten von Zeilen (Zeilen); Rechnung, Lieferant, Kaufauftrag. Früher in meinem Skript verwende ich pd.read_table, um die gesamte Datei in ein df zu lesen und dann df in 3 verschiedene Datenrahmen basierend auf dem Wert von 20 bis 22 zu unterteilen. all_df = pd.read_table ('MARCHGRIEF.TXT', names = ['whole_line'], Header = None). all_invoice = all_df [all_df.whole_line.str [20:22] == "IN"] ähnlich für Lieferant und po. Leider gibt mir read_fwf nicht die Möglichkeit, eine Zeile basierend auf einer Bedingung zu analysieren. Ich brauche das, weil jede Art von Linie/Reihe po, Lieferant unterschiedliche Struktur hat. – okyere

Verwandte Themen