Formatowanie / pomijanie notacji naukowej z wyników agregacji Python Pandas


162

Jak można zmodyfikować format danych wyjściowych z operacji grupowej w pandach, która tworzy notację naukową dla bardzo dużych liczb?

Wiem, jak wykonać formatowanie ciągów znaków w Pythonie, ale nie mam pojęcia, jak je tutaj zastosować.

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

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

To pomija notację naukową, jeśli konwertuję na ciąg, ale teraz zastanawiam się tylko, jak sformatować ciąg i dodać dziesiętne.

sum_sales_dept.astype(str)


3
Widziałem to pytanie, ale nie jestem pewien, jak mi to pomaga. Chcę tylko zachować bieżący typ dtype, który jest zmiennoprzecinkowy i po prostu pokazać wszystkie ułamki dziesiętne w wyniku zamiast notacji naukowej.
horatio1701d

To prawdopodobnie tylko ekspozycja. Ale jeśli uważasz, że coś szczególnego w Twoim problemie różni się od tego w linku Dana, musisz zamieścić więcej informacji o swoim problemie, najlepiej z małym zestawem danych, który odtwarza problem. A co z dtypestwoim wynikiem?
TomAugspurger

Odpowiedzi:


237

To prawda, odpowiedź, którą podałem w komentarzach, nie jest zbyt pomocna. W ten sposób możesz określić własny konwerter ciągów.

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

Nie jestem pewien, czy jest to preferowany sposób, ale działa.

Przekształcanie liczb na ciągi wyłącznie ze względów estetycznych wydaje się złym pomysłem, ale jeśli masz dobry powód, jest jeden sposób:

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
Dzięki Dan. Czy wiesz, jak zresetować opcje pand?
Josh

1
@Josh Aby tymczasowo ustawić opcje w pandach, możesz użyć pandas.option_context(patrz pandas.pydata.org/pandas-docs/stable/generated/ ... ).
muellermarkus

Często nie służy to celom estetycznym, ale szybszemu przeglądaniu informacji przez korę wzrokową po dużych ramkach danych liczbowych.
matanster

pd.set_option ('display.float_format', lambda x: '% .3f'% x) też działało dla mnie
powered_spider

5
To działa i możesz także użyć nowszej notacji f-string. Na przykład, pd.set_option('display.float_format', lambda x: f'{x:,.3f}')jeśli chcesz również separatora tysięcy.
576i

87

Oto inny sposób na zrobienie tego, podobny do odpowiedzi Dana Allana, ale bez funkcji lambda:

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

lub

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

1
Myślę, że użycie ciągu formatu byłoby bardziej przystępne dla członków zespołu, którzy są mniej zaznajomieni z Pythonem i mogą nie rozumieć funkcji lambda.
Steven C. Howell

23

Możesz użyć funkcji round, aby wyłączyć notację naukową dla określonej ramki danych:

df1.round(4)

lub możesz wyłączyć to globalnie przez:

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

11

Jeśli chcesz stylizować dane wyjściowe ramki danych w komórce notatnika jupyter, możesz ustawić styl wyświetlania na podstawie poszczególnych ramek danych:

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

wprowadź opis obrazu tutaj

Zobacz dokumentację tutaj .


0

Jeśli chcesz użyć wartości, powiedzmy jako części pliku csv csv.writer, liczby można sformatować przed utworzeniem listy:

df['label'].apply(lambda x: '%.17f' % x).values.tolist()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.