webentwicklung-frage-antwort-db.com.de

Floats in Ints in Pandas konvertieren?

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?

176
MJP

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
184
EdChum

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
>>>
145
Ryan G

Ä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
28
user4322543

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

9
enri

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.

6
aebmad
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
4
user8051244

**

So konvertieren Sie alle Float-Spalten in int

**

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
2
Suhas_Pote

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])
0
JohnE