Formatieren / Unterdrücken der wissenschaftlichen Notation aus den Ergebnissen der Python Pandas-Aggregation

162

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 eine Zeichenfolge konvertiere, aber jetzt frage ich mich nur, wie das Zeichenfolgenformat formatiert und Dezimalstellen hinzugefügt werden sollen.

sum_sales_dept.astype(str)
horatio1701d
quelle
3
Ich habe diese Frage gesehen, bin mir aber nicht sicher, wie mir das hilft. Ich möchte nur den aktuellen Float-Typ beibehalten und einfach alle Dezimalstellen im Ergebnis anstelle der wissenschaftlichen Notation anzeigen.
horatio1701d
Das ist wahrscheinlich nur eine Ausstellungssache. Wenn Sie jedoch der Meinung sind, dass sich an Ihrem Problem etwas Besonderes von dem in Dans Link unterscheidet, müssen Sie weitere Informationen zu Ihrem Problem veröffentlichen, vorzugsweise mit einem kleinen Datensatz, der das Problem reproduziert. Auch was sind die dtypesErgebnisse?
TomAugspurger

Antworten:

237

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 dies der bevorzugte Weg ist, aber es funktioniert.

Das Umwandeln von Zahlen in Zeichenfolgen aus rein ästhetischen Gründen scheint eine schlechte Idee zu sein. Wenn Sie jedoch 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
Dan Allan
quelle
1
Danke Dan. Wissen Sie, wie man Pandas-Optionen zurücksetzt?
Josh
1
@Josh Um vorübergehend Optionen in Pandas festzulegen , können Sie diese verwenden pandas.option_context(siehe pandas.pydata.org/pandas-docs/stable/generated/… ).
Müllermarkus
Dies dient häufig nicht ästhetischen Zwecken, sondern dem schnelleren Überfliegen von Informationen über den visuellen Kortex über große numerische Datenrahmen.
Matanster
pd.set_option ('display.float_format', lambda x: '% .3f'% x) hat auch für mich
funktioniert
5
Dies funktioniert und Sie können auch die neuere F-String-Notation verwenden. Zum Beispiel, pd.set_option('display.float_format', lambda x: f'{x:,.3f}')wenn Sie auch tausend Trennzeichen wollen.
576i
86

Hier ist eine andere Möglichkeit, ähnlich wie bei 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)
tfhans
quelle
1
Ich denke, die Verwendung einer Formatzeichenfolge wäre für Teammitglieder, die mit Python weniger vertraut sind und möglicherweise keine Lambda-Funktionen verstehen, zugänglicher.
Steven C. Howell
23

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

df1.round(4)

oder Sie können unterdrücken, ist global durch:

pd.options.display.float_format = '{:.4f}'.format
Vlad Bezden
quelle
11

Wenn Sie die Ausgabe eines Datenrahmens in einer Jupyter-Notebook-Zelle formatieren möchten, können Sie den Anzeigestil für jeden Datenrahmen festlegen:

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

Geben Sie hier die Bildbeschreibung ein

Siehe die Dokumentation hier .

florestan
quelle
0

Wenn Sie die Werte beispielsweise als Teil von csvfile csv.writer verwenden möchten, können die Zahlen vor dem Erstellen einer Liste formatiert werden:

df['label'].apply(lambda x: '%.17f' % x).values.tolist()
böse242
quelle