Wissenschaftliche Schreibweise aus Pandas-Aggregationsergebnissen formatieren/unterdrücken

Lesezeit: 4 Minuten

Benutzer-Avatar
horatio1701d

Wie kann man das Format für die Ausgabe einer Groupby-Operation in Pandas ändern, die eine wissenschaftliche Notation für sehr große Zahlen erzeugt?

Ich weiß, wie man Zeichenfolgen in Python formatiert, aber ich bin ratlos, wenn es darum geht, sie hier anzuwenden.

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

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

Dies unterdrückt die wissenschaftliche Notation, wenn ich in Strings umwandle, aber jetzt frage ich mich nur, wie man Strings formatiert und Dezimalstellen hinzufügt.

sum_sales_dept.astype(str)

  • mögliches Duplikat von Suppressing scientific notation in pandas?

    – Dan Allan

    15. Januar 2014 um 13:13 Uhr

  • Ich habe diese Frage gesehen, aber ich bin mir nicht sicher, wie das mir hilft. Ich versuche nur, den aktuellen dtype, der Float ist, beizubehalten und anstelle der wissenschaftlichen Notation einfach alle Dezimalstellen im Ergebnis anzuzeigen.

    – horatio1701d

    15. Januar 2014 um 13:52 Uhr

  • Das ist wahrscheinlich nur eine Anzeigesache. Wenn Sie jedoch der Meinung sind, dass sich Ihr Problem durch etwas Besonderes von dem in Dans Link unterscheidet, müssen Sie weitere Informationen zu Ihrem Problem posten, vorzugsweise mit einem kleinen Datensatz, der das Problem reproduziert. Auch was sind die dtypes zu deinem Ergebnis?

    – Tom Augspurger

    15. Januar 2014 um 14:18 Uhr

Zugegeben, die Antwort, die ich in den Kommentaren verlinkt habe, ist nicht sehr hilfreich. Sie können Ihren eigenen String-Konverter so angeben.

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

Ich bin mir nicht sicher, ob das der bevorzugte Weg ist, dies zu tun, aber es funktioniert.

Das Konvertieren von Zahlen in Zeichenfolgen aus rein ästhetischen Gründen scheint eine schlechte Idee zu sein, aber wenn Sie einen guten Grund haben, ist dies eine Möglichkeit:

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

  • Danke Dan. Weißt du, wie man Pandas-Optionen zurücksetzt?

    – Josch

    23. Januar 2017 um 19:04 Uhr

  • @Josh Um vorübergehend Optionen in Pandas festzulegen, können Sie verwenden pandas.option_context (sehen pandas.pydata.org/pandas-docs/stable/generated/…).

    – Müllermarkus

    27. Juli 2018 um 10:41 Uhr


  • Dies geschieht oft nicht aus ästhetischen Gründen, sondern zum schnelleren Überfliegen von Informationen über den visuellen Kortex über große numerische Datenrahmen.

    – Matanster

    20. April 2019 um 18:57 Uhr

  • pd.set_option(‘display.float_format’, lambda x: ‘%.3f’ % x) hat auch bei mir funktioniert

    – angetriebene_spinne

    28. Mai 2019 um 17:19 Uhr

  • Dies funktioniert und Sie können auch die neuere f-String-Notation verwenden. Wie pd.set_option('display.float_format', lambda x: f'{x:,.3f}') wenn Sie auch ein Tausendertrennzeichen wollen.

    – 576i

    29. Oktober 2019 um 10:26 Uhr


Benutzer-Avatar
tfans

Hier ist eine andere Möglichkeit, ähnlich der Antwort von Dan Allan, jedoch ohne die Lambda-Funktion:

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

oder

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

  • Ich denke, die Verwendung einer Formatzeichenfolge wäre für Teammitglieder zugänglicher, die mit Python weniger vertraut sind und Lambda-Funktionen möglicherweise nicht verstehen.

    – Steven C. Howell

    12. Oktober 2018 um 15:04 Uhr

Sie können die Rundungsfunktion verwenden, um die wissenschaftliche Notation für einen bestimmten Datenrahmen zu unterdrücken:

df1.round(4)

oder Sie können es global unterdrücken, indem Sie:

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

Wenn Sie die Ausgabe eines Datenrahmens in einer Jupyter-Notebook-Zelle gestalten möchten, können Sie den Anzeigestil pro Datenrahmen festlegen:

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

Geben Sie hier die Bildbeschreibung ein

Siehe Dokumentation hier.

Das globale Festlegen einer festen Anzahl von Dezimalstellen ist oft eine schlechte Idee, da es unwahrscheinlich ist, dass es eine angemessene Anzahl von Dezimalstellen für alle Ihre verschiedenen Daten gibt, die Sie unabhängig von der Größe anzeigen. Versuchen Sie stattdessen Folgendes, das Ihnen nur für große und sehr kleine Werte eine wissenschaftliche Notation gibt (und ein Tausendertrennzeichen hinzufügt, es sei denn, Sie lassen das “,” weg):

pd.set_option('display.float_format', lambda x: '%,g' % x)

Oder versuchen Sie Folgendes, um die wissenschaftliche Notation fast vollständig zu unterdrücken, ohne an Genauigkeit zu verlieren:

pd.set_option('display.float_format', str)

  • Vielen Dank! Die erste Option schlägt jedoch in bestimmten Fällen fehl.

    – Ethan

    5. Dezember 2021 um 0:21 Uhr

Benutzer-Avatar
Voller Leben

Ich hatte mehrere Datenrahmen mit unterschiedlichen Gleitkommazahlen, also danke an Allans Idee, die dynamische Länge gemacht hat.

pd.set_option('display.float_format', lambda x: f'%.{len(str(x%1))-2}f' % x)

Das Minus davon ist, dass, wenn Sie die letzte 0 im Float haben, es abgeschnitten wird. Es wird also nicht 0,000070, sondern 0,00007 sein.

  • Vielen Dank! Die erste Option schlägt jedoch in bestimmten Fällen fehl.

    – Ethan

    5. Dezember 2021 um 0:21 Uhr

Benutzer-Avatar
Gibbon

Als Erweiterung dieses nützlichen Kommentars finden Sie hier eine Lösung, bei der die Formatierungsoptionen nur so eingestellt werden, dass die Ergebnisse angezeigt werden, ohne die Optionen dauerhaft zu ändern:

with pd.option_context('display.float_format', lambda x: f'{x:,.3f}'):
    display(sum_sales_dept)

dept
value1  119,243,300.0
value2  129,306,600.0
value3  107,714,200.0

1055580cookie-checkWissenschaftliche Schreibweise aus Pandas-Aggregationsergebnissen formatieren/unterdrücken

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy