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)
horatio1701d
źródło
2
możliwy duplikat Tłumienia notacji naukowej w pandach?
Dan Allan,
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
Dan Allan
źródło
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)
tfhans
źródło
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
Vlad Bezden
źródło
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 .

florestan
źródło
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()
zło 242
źródło