2013-08-23 47 views
15

Come Python newbie ho recentemente scoperto che con Py 2.7 posso fare qualcosa di simile:Py Pandas .format (dataframe)

print '{:20,.2f}'.format(123456789) 

che darà l'output risultante:

123,456,789.00 

Sono ora cercando di avere un risultato simile per un df panda così il mio codice era come:

import pandas as pd 
import random 
data = [[random.random()*10000 for i in range(1,4)] for j in range (1,8)] 
df = pd.DataFrame (data) 
print '{:20,.2f}'.format(df) 

In questo caso ho l'errore:

Unknown format code 'f' for object of type 'str' 

Qualche suggerimento per eseguire qualcosa come '{:20,.2f}'.format(df)?

Come ora la mia idea è indicizzare il dataframe (è piccolo), quindi formattare ogni singolo float al suo interno, potrebbe essere assegnato astype (str) e ricostruire il DF ... ma sembra così brutto: - (e non sono nemmeno sicuro che funzionerà ..

Cosa ne pensi? Sono bloccato ... e mi piacerebbe avere un formato migliore per i miei datagrammi quando questi vengono convertiti in griglie di reportlabs.

risposta

24
import pandas as pd 
import numpy as np 
data = np.random.random((8,3))*10000 
df = pd.DataFrame (data) 
pd.options.display.float_format = '{:20,.2f}'.format 
print(df) 

rese (uscita casuale simile a)

     0     1     2 
0    4,839.01    6,170.02    301.63 
1    4,411.23    8,374.36    7,336.41 
2    4,193.40    2,741.63    7,834.42 
3    3,888.27    3,441.57    9,288.64 
4    220.13    6,646.20    3,274.39 
5    3,885.71    9,942.91    2,265.95 
6    3,448.75    3,900.28    6,053.93 

Il docstring per pd.set_option o pd.describe_option spiega:

display.float_format: [default: None] [currently: None] : callable 
     The callable should accept a floating point number and return 
     a string with the desired format of the number. This is used 
     in some places like SeriesFormatter. 
     See core.format.EngFormatter for an example. 
+0

Grazie tanto per questo! Sembra perfetto :-) per il dataframe. È un grande passo in avanti ... ora mi trovo di fronte al prossimo argomento che riguarda il reportlab .. ah ah .. divertente .. quando DF viene convertito in griglie, quindi apparentemente perderò il formato ... uffff .... ma Tratterò in qualche modo .. Ottimo aiuto da parte tua !! Grazie mille !! –

+3

Può anche farlo come 'pd.options.display.float_format = '{: 20, .2f}'. Format' o' pd.set_option ('float_format', '{: 20, .2f}'. Format) ' :) http://pandas.pydata.org/pandas-docs/stable/basics.html#working-with-package-options –

+0

@AndyHayden: Grazie per il suggerimento! – unutbu