webentwicklung-frage-antwort-db.com.de

pandas to_csv Argumente float_format und decimal funktionieren nicht für die Indexspalte

Hintergrund

Ich mache ein paar Simulationen bzw. eine Systemanalyse durch Variieren von Parametern (in diesem Fall nur rpm) und Anhängen der letzten Zeile eines Ergebnisdatenrahmens results_df an einen zusammenfassenden Datenrahmen df, der das Verhalten meines Systems angibt in Abhängigkeit von der variierten rpm.

Um einen geeigneten Index für das Zeichnen und die Datenanalyse zu erhalten, habe ich die variierten Werte (hier rpm) aus der Liste in eine pandas series ser und concat konvertiert Diese Serie mit dem zusammenfassenden Datenrahmen df mit den Ergebnissen, an denen ich interessiert bin.

Da die Ergebnisse jeder Berechnung, die mich interessiert, nur die letzte Zeile jeder Berechnung sind, extrahiere ich diese Daten aus dem Ergebnisdatenrahmen results_df Unter Verwendung von .tail(1).

Was ich bisher gemacht habe, zeigt das folgende Snippet:

rpm = [0.25, 0.3, 0.5, 0.75, 1.0, 1.5, 2.0]

ser = pd.Series(rpm, name='rpm')
df = pd.DataFrame()
df_list = list()

for i, val in enumerate(rpm):
    results_df = get_some_data_from_somwhere()
    df_list.append(results_df.tail(1))

df = df.append(df_list, ignore_index=True)
df = pd.concat([df, ser], axis=1)
df.set_index('rpm', inplace=True)


with open('foo.csv', 'w') as f:
    data.to_csv(f, index=True, header=True, decimal=',', sep=' ', float_format='%.3f')

Problem

Diese CSV-Datei hat folgendes Format:

rpm cooling_inner heating_inner cooling_outlet heating_outlet
0.25 303,317 323,372 302,384 324,332

Ich habe jedoch erwartet, dass meine Indexspalte drei Dezimalstellen und ein Komma als Dezimalzeichen enthält, wie hier gezeigt:

rpm cooling_inner heating_inner cooling_outlet heating_outlet
0,250 303,317 323,372 302,384 324,332

Es scheint also, dass die Zeichenoptionen index und decimal nicht auf die Indexspalte angewendet werden, wenn Datenrahmen mit dem Befehl .to_csv In CSV-Dateien exportiert werden.

Wie könnte ich dieses Verhalten erreichen, da die Option index auf True gesetzt ist und alle Werte (mit Ausnahme der Indexspalte) das richtige Format und Dezimalzeichen haben?

Muss ich die Indexspalte irgendwie getrennt behandeln?

17
albert

Ich würde Ihre beiden Grundlinien umschreiben:

with open('foo.csv', 'w') as f:
    data.to_csv(f, index=True, header=True, decimal=',', sep=' ', float_format='%.3f')

In

data.reset_index().to_csv('foo.csv', index=False, header=True, decimal=',', sep=' ', float_format='%.3f')

Dies ist eine kleine Problemumgehung, aber wie Sie bemerkt haben, funktionieren die Schlüsselwortargumente decimal= Und float_format= Nur für Daten Spalten, nicht für den Index.

Stattdessen füge ich den Index mit reset_index In den Datenrahmen ein und fordere dann to_csv(index=False Auf, den Index nicht in der Datei zu speichern (da er sich jetzt in den Daten befindet).

Außerdem ist es besser, einen Dateistream selbst zu öffnen (with open('foo.csv', 'w') as f:), der pandas überlassen wird. Dies geschieht von selbst, wenn Sie ihm einfach als erstes Argument einen String 'foo.csv' Geben.

20
firelynx