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')
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?
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.