Ich habe mit Daten gearbeitet, die aus einer CSV importiert wurden. Pandas hat einige Spalten in Gleitkommazahlen geändert. Die Zahlen in diesen Spalten werden nun als Gleitkommazahlen angezeigt. Sie müssen jedoch als Ganzzahl oder ohne Komma angezeigt werden. Gibt es eine Möglichkeit, sie in Ganzzahlen umzuwandeln oder das Komma nicht anzuzeigen?
So ändern Sie die Float-Ausgabe:
df= pd.DataFrame(range(5), columns=['a'])
df.a = df.a.astype(float)
df
Out[33]:
a
0 0.0000000
1 1.0000000
2 2.0000000
3 3.0000000
4 4.0000000
pd.options.display.float_format = '{:,.0f}'.format
df
Out[35]:
a
0 0
1 1
2 2
3 3
4 4
Verwenden Sie die Funktion .astype(<type>)
, um Spaltentypen zu bearbeiten.
>>> df = pd.DataFrame(np.random.Rand(3,4), columns=list("ABCD"))
>>> df
A B C D
0 0.542447 0.949988 0.669239 0.879887
1 0.068542 0.757775 0.891903 0.384542
2 0.021274 0.587504 0.180426 0.574300
>>> df[list("ABCD")] = df[list("ABCD")].astype(int)
>>> df
A B C D
0 0 0 0 0
1 0 0 0 0
2 0 0 0 0
BEARBEITEN:
So behandeln Sie fehlende Werte:
>>> df
A B C D
0 0.475103 0.355453 0.66 0.869336
1 0.260395 0.200287 NaN 0.617024
2 0.517692 0.735613 0.18 0.657106
>>> df[list("ABCD")] = df[list("ABCD")].fillna(0.0).astype(int)
>>> df
A B C D
0 0 0 0 0
1 0 0 0 0
2 0 0 0 0
>>>
Ändern Sie mithilfe einer Liste mit Spaltennamen den Typ für mehrere Spalten mit .applymap () oder für eine einzelne Spalte mit .apply ().
df = pd.DataFrame(10*np.random.Rand(3, 4), columns=list("ABCD"))
A B C D
0 8.362940 0.354027 1.916283 6.226750
1 1.988232 9.003545 9.277504 8.522808
2 1.141432 4.935593 2.700118 7.739108
cols = ['A', 'B']
df[cols] = df[cols].applymap(np.int64)
A B C D
0 8 0 1.916283 6.226750
1 1 9 9.277504 8.522808
2 1 4 2.700118 7.739108
df['C'] = df['C'].apply(np.int64)
A B C D
0 8 0 1 6.226750
1 1 9 9 8.522808
2 1 4 2 7.739108
Dies ist eine schnelle Lösung für den Fall, dass Sie mehr Spalten Ihres Pandas DataFrame df von float in integer konvertieren möchten, auch wenn Sie NaN-Werte haben können.
cols = ['col_1', 'col_2', 'col_3', 'col_4']
for col in cols:
df[col] = df[col].apply(lambda x: int(x) if x == x else "")
Ich habe versucht mit:
else x)
else None)
aber das Ergebnis hat immer noch die Gleitkommazahl, also habe ich else ""
verwendet
Wenn Sie die von @Ryan G erwähnte Verwendung der Funktion .astype(<type>)
erweitern, können Sie mit dem Argument errors=ignore
nur die Spalten konvertieren, die keinen Fehler verursachen, was die Syntax erheblich vereinfacht. Natürlich sollte beim Ignorieren von Fehlern Vorsicht walten, aber für diese Aufgabe ist es sehr praktisch.
df = pd.DataFrame(np.random.Rand(3,4), columns=list("ABCD"))
df *= 10
df
A B C D
0 2.16861 8.34139 1.83434 6.91706
1 5.85938 9.71712 5.53371 4.26542
2 0.50112 4.06725 1.99795 4.75698
df['E'] = list("XYZ")
df.astype(int, errors='ignore')
A B C D E
0 2 8 1 6 X
1 5 9 5 4 Y
2 0 4 1 4 Z
Von astype docs:
fehler: {"Raise", "Ignorieren"}, Standardeinstellung "Raise"
Kontrolliert das Auslösen von Ausnahmen bei ungültigen Daten für den angegebenen D-Typ.
- raise: Erlaubt das Auslösen von Ausnahmen
- ignorieren: Ausnahmen unterdrücken. Bei Fehler Originalobjekt zurückgeben
Neu in Version 0.20.0.
import pandas as pd;
right = pd.DataFrame({'C': [1.002, 2.003],
'D': [1.009, 4.55],
"key":['K0', 'K1']})
C D key
0 1.002 1.009 K0
1 2.003 4.550 K1
right['C'] = right.C.astype(int)
C D key
0 1 1.009 K0
1 2 4.550 K1
**
**
df = pd.DataFrame(np.random.Rand(5,4) * 10, columns=list("PQRS"))
df
P Q R S
0 4.395994 0.844292 8.543430 1.933934
1 0.311974 9.519054 6.171577 3.859993
2 2.056797 0.836150 5.270513 3.224497
3 3.919300 8.562298 6.852941 1.415992
4 9.958550 9.013425 8.703142 3.588733
float_col = df.select_dtypes(include = ['float64']) # This will select float columns only
# list(float_col.columns.values)
for col in float_col.columns.values:
df[col] = df[col].astype('int64')
df
P Q R S
0 4 0 8 1
1 0 9 6 3
2 2 0 5 3
3 3 8 6 1
4 9 9 8 3
Hier ist eine einfache Funktion, die das Downcasting in den kleinstmöglichen Integer-Typ ausführt, ohne dass Informationen verloren gehen. Zum Beispiel,
100.0 kann von float in integer konvertiert werden, 99.9 jedoch nicht (ohne Informationen durch Abrunden oder Abschneiden zu verlieren)
Darüber hinaus kann 1.0 bis zu int8
heruntergespielt werden, ohne dass Informationen verloren gehen. Der kleinste ganzzahlige Typ für 100_000.0 ist jedoch int32
.
Codebeispiele:
import numpy as np
import pandas as pd
def float_to_int( s ):
if ( s.astype(np.int64) == s ).all():
return pd.to_numeric( s, downcast='integer' )
else:
return s
# small integers are downcast into 8-bit integers
float_to_int( np.array([1.0,2.0]) )
Out[1]:array([1, 2], dtype=int8)
# larger integers are downcast into larger integer types
float_to_int( np.array([100_000.,200_000.]) )
Out[2]: array([100000, 200000], dtype=int32)
# if there are values to the right of the decimal
# point, no conversion is made
float_to_int( np.array([1.1,2.2]) )
Out[3]: array([ 1.1, 2.2])