Formatar / suprimir notação científica dos resultados da agregação do Python Pandas


162

Como se pode modificar o formato da saída de uma operação de grupo em pandas que produz notação científica para números muito grandes?

Sei como formatar strings em python, mas não consigo aplicá-lo aqui.

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

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

Isso suprime a notação científica se eu converter para string, mas agora estou pensando em como formatar o string e adicionar decimais.

sum_sales_dept.astype(str)


3
Eu vi essa pergunta, mas não tenho certeza de como isso me ajuda. Eu só estou procurando preservar o dtype atual que é float e simplesmente mostrar todas as casas decimais no resultado, em vez de notação científica.
precisa saber é o seguinte

Provavelmente isso é apenas uma coisa de exibição. Mas se você acha que algo em particular sobre o seu problema faz com que o seu seja diferente daquele no link de Dan, você precisa postar mais informações sobre o problema, de preferência com um pequeno conjunto de dados que reproduza o problema. Também quais são os dtypesseus resultados?
precisa saber é o seguinte

Respostas:


237

É verdade que a resposta que eu vinculei nos comentários não é muito útil. Você pode especificar seu próprio conversor de string dessa forma.

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

Não tenho certeza se essa é a maneira preferida de fazer isso, mas funciona.

Converter números em sequências puramente para fins estéticos parece uma péssima idéia, mas se você tiver um bom motivo, esta é uma maneira:

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
Obrigado Dan. Você sabe como redefinir as opções de pandas?
Josh

1
@ Josh Para definir opções temporariamente no pandas, você pode usar pandas.option_context(consulte pandas.pydata.org/pandas-docs/stable/generated/… ).
muellermarkus

Muitas vezes, não é para fins estéticos, mas para uma análise mais rápida das informações através do córtex visual em grandes quadros de dados numéricos.
matanster

pd.set_option ( 'display.float_format', lambda x: '% .3f' % x) trabalhou para mim também
driven_spider

5
Isso funciona e você também pode usar a notação f-string mais recente. Como pd.set_option('display.float_format', lambda x: f'{x:,.3f}')se você quiser um separador de mil também.
576i

87

Aqui está outra maneira de fazer isso, semelhante à resposta de Dan Allan, mas sem a função lambda:

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

ou

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

1
Eu acho que usar uma string de formato seria mais acessível aos membros da equipe que estão menos familiarizados com o Python e podem não entender as funções lambda.
Steven C. Howell

23

Você pode usar a função round apenas para suprimir a notação científica de um dataframe específico:

df1.round(4)

ou você pode suprimir globalmente:

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

11

Se você deseja estilizar a saída de um quadro de dados em uma célula do notebook jupyter, pode definir o estilo de exibição por quadro de dados:

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

insira a descrição da imagem aqui

Veja a documentação aqui .


0

Se você deseja usar os valores, digamos, como parte do csvfile csv.writer, os números podem ser formatados antes de criar uma lista:

df['label'].apply(lambda x: '%.17f' % x).values.tolist()
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.