web-dev-qa-db-fra.com

pandas to_csv arguments float_format et décimal ne fonctionne pas pour la colonne d'index

Contexte

Je fais quelques simulations resp. une analyse du système en faisant varier les paramètres (dans ce cas rpm uniquement) et en ajoutant chaque dernière ligne d'une trame de données de résultats results_df à une trame de données récapitulative df contenant les informations sur la bavière de mon système en fonction des différents rpm.

Afin d'obtenir un index approprié pour le traçage et l'analyse des données, j'ai converti les valeurs variées (ici rpm) de la liste en une série pandas ser et concat cette série avec la trame de données récapitulative df contenant les résultats qui m'intéressent.

Étant donné que les résultats de chaque calcul qui m'intéressent ne sont que la dernière ligne de chaque calcul, j'extrais ces données du cadre de données de résultats results_df En utilisant .tail(1).

Ce que j'ai fait jusqu'à présent est illustré dans l'extrait de code suivant:

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

Problème

Ce fichier csv que j'obtiens a le format suivant:

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

Cependant, je m'attendais à avoir trois chiffres décimaux et une virgule comme signe décimal dans ma colonne d'index, comme indiqué ici:

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

Il semble donc que les options de signe index et decimal ne soient pas appliquées à la colonne d'index lors de l'exportation de trames de données vers des fichiers csv à l'aide de la commande .to_csv.

Comment pourrais-je obtenir ce comportement puisque l'option index est définie True et que toutes les valeurs (à l'exception de la colonne d'index) ont le bon format et le signe décimal?

Dois-je gérer la colonne d'index d'une manière ou d'une autre?

17
albert

Je réécrirais vos deux lignes de fond:

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

Dans

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

C'est un peu une solution de contournement, mais comme vous l'avez remarqué, les arguments de mot clé decimal= Et float_format= Ne fonctionnent que sur les colonnes data, pas sur l'index.

Ce que je fais à la place, c'est de mettre l'index dans la trame de données avec reset_index Puis je dis à to_csv(index=False De ne pas enregistrer l'index dans le fichier (car il est maintenant dans les données).

De plus, ouvrir un flux de fichiers vous-même (with open('foo.csv', 'w') as f:) est mieux laissé aux pandas, qui le font par eux-mêmes lorsque vous lui donnez simplement une chaîne 'foo.csv' Comme premier argument.

20
firelynx