Formatta / elimina la notazione scientifica dai risultati dell'aggregazione di python panda


162

Come si può modificare il formato dell'output da un'operazione groupby in panda che produce notazione scientifica per numeri molto grandi?

So come eseguire la formattazione delle stringhe in Python ma non riesco ad applicarlo qui.

df1.groupby('dept')['data1'].sum()

dept
value1       1.192433e+08
value2       1.293066e+08
value3       1.077142e+08

Questo sopprime la notazione scientifica se converto in stringa ma ora mi chiedo solo come formattare la stringa e aggiungere decimali.

sum_sales_dept.astype(str)


3
Ho visto quella domanda ma non sono sicuro di come mi aiuti. Sto solo cercando di preservare l'attuale tipo che è float e mostra semplicemente tutti i decimali nel risultato anziché la notazione scientifica.
horatio1701d

Questa è probabilmente solo una cosa da mostrare. Ma se pensi che ci sia qualcosa di particolare nel tuo problema che rende il tuo diverso da quello nel link di Dan, allora devi pubblicare più informazioni sul tuo problema, preferibilmente con un piccolo set di dati che riproduce il problema. Inoltre quali sono i dtypesrisultati?
TomAugspurger,

Risposte:


237

Certo, la risposta che ho collegato nei commenti non è molto utile. È possibile specificare il proprio convertitore di stringhe in questo modo.

In [25]: pd.set_option('display.float_format', lambda x: '%.3f' % x)

In [28]: Series(np.random.randn(3))*1000000000
Out[28]: 
0    -757322420.605
1   -1436160588.997
2   -1235116117.064
dtype: float64

Non sono sicuro che sia il modo preferito per farlo, ma funziona.

La conversione di numeri in stringhe puramente per scopi estetici sembra una cattiva idea, ma se hai una buona ragione, questo è un modo:

In [6]: Series(np.random.randn(3)).apply(lambda x: '%.3f' % x)
Out[6]: 
0     0.026
1    -0.482
2    -0.694
dtype: object

1
Grazie Dan. Sai come resettare le opzioni dei panda?
Josh,

1
@Josh Per impostare temporaneamente le opzioni in Panda, puoi usare pandas.option_context(vedi pandas.pydata.org/pandas-docs/stable/generated/… ).
muellermarkus,

Spesso non è per scopi estetici, ma per una più rapida scrematura delle informazioni attraverso la corteccia visiva su grandi cornici di dati numerici.
matanster

pd.set_option ('display.float_format', lambda x: '% .3f'% x) ha funzionato anche per me
driven_spider

5
Funziona e puoi anche usare la più recente notazione f-string. Come pd.set_option('display.float_format', lambda x: f'{x:,.3f}')se volessi anche un mille separatore.
576i

87

Ecco un altro modo di farlo, simile alla risposta di Dan Allan ma senza la funzione lambda:

>>> pd.options.display.float_format = '{:.2f}'.format
>>> Series(np.random.randn(3))
0    0.41
1    0.99
2    0.10

o

>>> pd.set_option('display.float_format', '{:.2f}'.format)

1
Penso che usare una stringa di formato sarebbe più accessibile ai membri del team che hanno meno familiarità con Python e potrebbero non comprendere le funzioni lambda.
Steven C. Howell,

23

È possibile utilizzare la funzione rotonda solo per sopprimere la notazione scientifica per frame di dati specifici:

df1.round(4)

oppure puoi sopprimerlo a livello globale:

pd.options.display.float_format = '{:.4f}'.format

11

Se si desidera modellare l'output di un frame di dati in una cella di notebook jupyter, è possibile impostare lo stile di visualizzazione in base al frame di dati:

df = pd.DataFrame({'A': np.random.randn(4)*1e7})
df.style.format("{:.1f}")

inserisci qui la descrizione dell'immagine

Vedi la documentazione qui .


0

Se desideri utilizzare i valori, ad esempio come parte di csvfile csv.writer, i numeri possono essere formattati prima di creare un elenco:

df['label'].apply(lambda x: '%.17f' % x).values.tolist()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.