Ho giocato con una funzione che assume i dati CSV e utilizza la funzione to_dict di pand come una delle fasi verso l'obiettivo finale della conversione dei dati in JSON. Il problema è che sta modificando i numeri (ad esempio 1.6 diventa 1.6000000000000001). Non sono preoccupato per la perdita di precisione, ma poiché gli utenti vedranno il cambiamento nei numeri, sembra ... dilettantesco.Pandas to_dict che modifica i numeri
Sono consapevole che questo è qualcosa che è venuto fuori prima dello here, ma era 2 anni fa, non mi è stata data una risposta soddisfacente, e ho un'ulteriore complicazione: i frame di dati che sto cercando di convertire nei dizionari potrebbe essere una qualsiasi combinazione di tipi di dati. Come tale il problema con le soluzioni precedenti sono:
- La conversione di tutti i numeri per oggetti funziona solo se non avete bisogno di usare i numeri - voglio la possibilità di calcolare le somme e le medie, che reintroduce il problema decimale aggiunta
- Forza arrotondamento dei numeri per x decimali sarà o ridurre la precisione o aggiungere ulteriori 0s inutili a seconda dei dati che l'utente fornisce
Così, ad un alto livello, la mia domanda è:
c'è un modo migliore per garantire che i numeri non vengano modificati, ma che siano mantenuti in un tipo di dati numerico? Si tratta di cambiare il modo in cui importare i dati CSV in primo luogo? Sicuramente c'è una soluzione semplice che sto trascurando?
Ecco un semplice script che riprodurre il bug:
import pandas as pd
import sys
if sys.version_info[0] < 3:
from StringIO import StringIO
else:
from io import StringIO
CSV_Data = "Index,Column_1,Column_2,Column_3,Column_4,Column_5,Column_6,Column_7,Column_8\nindex_1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8\nindex_2,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8\nindex_3,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8\nindex_4,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8"
input_data = StringIO(CSV_Data)
df = pd.DataFrame.from_csv(path = input_data, header = 0, sep=',', index_col=0, encoding='utf-8')
print(df.to_dict(orient = 'records'))
Perché non usare 'df.to_json (= orientare 'record')', se obiettivo finale è quello di utilizzare JSON? – Zero
@JohnGalt Fondamentalmente, per consentire l'annidamento dinamico di colonne, il dizionario che creo usando to_dict viene inserito in un dizionario più grande che sto costruendo, che alla fine viene scaricato su un JSON. –
potresti usare 'pd.io.json.dumps (nested_dicts_with_pd_objects)', funziona per te? Idealmente, non dovrebbe introdurre uno scenario di arrotondamento. – Zero