2017-03-15 4 views
2

Ich habe ein etwas seltsames Verhalten gefunden, wenn ich einen Pandas DataFrame aus Listen erstelle und ihn in csv mit einem bestimmten Dezimaltrennzeichen umwandle.Pandas DataFrame to csv: Dezimaltrennzeichen für gemischten Typ angeben

Dies funktioniert wie erwartet:

>>> import pandas as pd 
>>> a = pd.DataFrame([['a', 0.1], ['b', 0.2]]) 
>>> a 
    0 1 
0 a 0.1 
1 b 0.2 
>>> a.to_csv(decimal=',', sep=' ') 
' 0 1\n0 a 0,1\n1 b 0,2\n' 

jedoch in diesem Fall das Dezimaltrennzeichen eingestellt ist nicht richtig:

>>> b = pd.DataFrame([['a', 'b'], [0.1, 0.2]]) 
>>> b 
    0 1 
0 a b 
1 0.1 0.2 
>>> b.to_csv(decimal=',', sep=' ') 
' 0 1\n0 a b\n1 0.1 0.2\n' 

Wenn ich transponieren b, um einen Datenrahmen wie a das Dezimalsystem zu erhalten Separator ist immer noch nicht richtig eingestellt:

>>> b.T.to_csv(decimal=',', sep=' ') 
' 0 1\n0 a 0.1\n1 b 0.2\n' 

Warum ich frage: In meinem Programm habe ich Spalten als einzelne Listen (z. col1 = ['a', 'b'] und col2 = [0.1, 0.2], aber die Anzahl und das Format der Spalten variieren kann), und ich möchte sie konvertieren mit einem bestimmten Dezimaltrennzeichens csv, so möchte ich wie eine Ausgabe haben

' 0 1\n0 a 0,1\n1 b 0,2\n' 
+0

Welche Version von Pandas verwenden Sie? dezimal wurde nur in 0.16 ab –

+0

@NickHale Ich benutze 0.18.1 – elzell

Antwort

1

Verwendung applymap und Guss Die float typisierten Zellen zu str, indem Sie explizit auf ihren Typ überprüfen. Ersetzen Sie dann den Dezimalpunkt (.) durch das Komma (,), da jede Zelle jetzt eine Zeichenfolge darstellt und den Inhalt später in eine csv-Datei ablegt.

b.applymap(lambda x: str(x).replace(".", ",") if isinstance(x, float) else x).to_csv(sep=" ") 
# ' 0 1\n0 a b\n1 0,1 0,2\n' 
+0

Danke für den Vorschlag, aber ich würde dies mehr als ein letzter Ausweg sehen, wenn es keinen anderen Weg gibt, weil meine String-Spalten auch Punkte enthalten können (einer der die String-Spalten enthalten Dateinamen), die ebenfalls konvertiert würden. – elzell

+0

Zumindest ist es jetzt ein schöner Workaround :) – elzell

+0

Da ihre Typen höchstwahrscheinlich miteinander vermischt werden, ist dies eine sichere Option zu berücksichtigen. –