379 Stimmen

Entfernen von unendlichen Werten aus Dataframes in Pandas?

Wie entferne ich die Werte nan, inf und -inf aus einem DataFrame, ohne mode.use_inf_as_null zurückzusetzen?

Kann ich dropna sagen, dass inf in seiner Definition von fehlenden Werten enthalten sein soll, damit das Folgende funktioniert?

df.dropna(subset=["col1", "col2"], how="all")

8voto

Ted Petrou Punkte 56706

Noch eine Lösung wäre die Verwendung der isin Methode. Verwenden Sie sie, um zu bestimmen, ob jeder Wert unendlich oder fehlend ist, und verknüpfen Sie dann die all Methode, um zu bestimmen, ob alle Werte in den Zeilen unendlich oder fehlend sind.

Verwenden Sie schließlich die Negation dieses Ergebnisses, um die Zeilen auszuwählen, die nicht alle unendlichen oder fehlenden Werte über das boolesche Indexieren enthalten.

all_inf_or_nan = df.isin([np.inf, -np.inf, np.nan]).all(axis='columns')
df[~all_inf_or_nan]

5voto

jpp Punkte 146159

Sie können pd.DataFrame.mask mit np.isinf verwenden. Stellen Sie zunächst sicher, dass Ihre DataFrame-Spalten alle vom Typ float sind. Verwenden Sie dann dropna mit Ihrer vorhandenen Logik.

print(df)

       col1      col2
0 -0.441406       inf
1 -0.321105      -inf
2 -0.412857  2.223047
3 -0.356610  2.513048

df = df.mask(np.isinf)

print(df)

       col1      col2
0 -0.441406       NaN
1 -0.321105       NaN
2 -0.412857  2.223047
3 -0.356610  2.513048

4voto

Pulkit Bansal Punkte 1303

Um sowohl Nan als auch inf mit einem einzelnen Befehl zu entfernen, verwenden Sie

df = df[ np.isfinite( df ).all( axis = 1) ]

Wenn aus irgendeinem Grund das Oben genannte nicht funktioniert, versuchen Sie bitte die folgenden 2 Schritte:

df = df[ ~( df.isnull().any( axis = 1 ) ) ] # um nan zu entfernen
df = df[ ~( df.isin( [np.inf, -np.inf]).any(axis =1) )] # um inf zu entfernen

3voto

Hari Krishnan Punkte 31

Im Gegensatz zu anderen Antworten hier hat dieser Einzeiler für mich funktioniert.

import numpy as np
df= df[df['required_column_name']!= np.inf]

2voto

Thomas Moreau Punkte 4377

Bin gerade auf diesen gestoßen und habe eine einzige Zeile ohne replace oder numpy gefunden:

df = pd.DataFrame(
    [[1, np.inf],
     [1, -np.inf],
     [1, 2]],
    columns=['a', 'b']
)
df.query("b not in [inf, -inf]")
>>> a  b
 2  1  2.0

Für einige Versionen von pandas könnte es erforderlich sein, um den Namen der Spalte b` zurück tick` zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X