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.
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
Ich werde lieber nicht eine Datei vor dem Read_fwf auf die Festplatte schreiben. Danke für das Vorschlagen. – okyere