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")

678voto

Andy Hayden Punkte 324102

Zuerst replace() Infs mit NaN:

df.replace([np.inf, -np.inf], np.nan, inplace=True)

und dann NaNs mit dropna() entfernen:

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

Zum Beispiel:

>>> df = pd.DataFrame({"col1": [1, np.inf, -np.inf], "col2": [2, 3, np.nan]})
>>> df
   col1  col2
0   1.0   2.0
1   inf   3.0
2  -inf   NaN

>>> df.replace([np.inf, -np.inf], np.nan, inplace=True)
>>> df
   col1  col2
0   1.0   2.0
1   NaN   3.0
2   NaN   NaN

>>> df.dropna(subset=["col1", "col2"], how="all", inplace=True)
>>> df
   col1  col2
0   1.0   2.0
1   NaN   3.0

Dieselbe Methode funktioniert auch für Series.

87voto

ayhan Punkte 68314

Mit der Option "context" ist dies möglich, ohne use_inf_as_na dauerhaft festzulegen. Zum Beispiel:

with pd.option_context('mode.use_inf_as_na', True):
    df = df.dropna(subset=['col1', 'col2'], how='all')

Natürlich kann es dauerhaft auf inf als NaN behandelt werden mit

pd.set_option('use_inf_as_na', True)

Für ältere Versionen ersetzen Sie use_inf_as_na durch use_inf_as_null.

30voto

Markus Dutschke Punkte 6917

Verwenden (schnell und einfach):

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

Diese Antwort basiert auf Dougs Antwort in einer anderen Frage. Hier ein Beispielcode:

import pandas as pd
import numpy as np
df=pd.DataFrame([1,2,3,np.nan,4,np.inf,5,-np.inf,6])
print('Eingabe:\n',df,sep='')
df = df[np.isfinite(df).all(1)]
print('\nGelöscht:\n',df,sep='')

Ergebnis:

Eingabe:
    0
0  1.0000
1  2.0000
2  3.0000
3     NaN
4  4.0000
5     inf
6  5.0000
7    -inf
8  6.0000

Gelöscht:
     0
0  1.0
1  2.0
2  3.0
4  4.0
6  5.0
8  6.0

18voto

Alexander Punkte 96032

Hier ist eine weitere Methode, um .loc zu verwenden, um inf durch nan in einer Serie zu ersetzen:

s.loc[(~np.isfinite(s)) & s.notnull()] = np.nan

Also, als Antwort auf die ursprüngliche Frage:

df = pd.DataFrame(np.ones((3, 3)), columns=list('ABC'))

for i in range(3): 
    df.iat[i, i] = np.inf

df
          A         B         C
0       inf  1.000000  1.000000
1  1.000000       inf  1.000000
2  1.000000  1.000000       inf

df.sum()
A    inf
B    inf
C    inf
dtype: float64

df.apply(lambda s: s[np.isfinite(s)].dropna()).sum()
A    2
B    2
C    2
dtype: float64

9voto

has2k1 Punkte 1680

Die obige Lösung ändert die inf-Werte, die nicht in den Zielspalten sind. Um das zu beheben,

lst = [np.inf, -np.inf]
to_replace = {v: lst for v in ['col1', 'col2']}
df.replace(to_replace, np.nan)

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