web-dev-qa-db-de.com

Wie kann man überprüfen, ob eine bestimmte Zelle in Pandas DataFrame nicht gültig ist?

Ich habe die folgende df in Pandas.

0       A     B     C
1       2   NaN     8

Wie kann ich überprüfen, ob df.iloc[1]['B'] NaN ist?

Ich habe es mit df.isnan() ausprobiert und bekomme eine Tabelle wie diese:

0       A     B      C
1   false  true  false

ich bin mir jedoch nicht sicher, wie die Tabelle indiziert werden soll und ob dies eine effiziente Möglichkeit ist, die Aufgabe überhaupt auszuführen?

4
Newskooler

Verwenden Sie pd.isnull , zur Auswahl verwenden Sie loc oder iloc :

print (df)
   0  A   B  C
0  1  2 NaN  8

print (df.loc[0, 'B'])
nan

a = pd.isnull(df.loc[0, 'B'])
print (a)
True

print (df['B'].iloc[0])
nan

a = pd.isnull(df['B'].iloc[0])
print (a)
True
8
jezrael

jezrael Antwort ist genau das Richtige. Wenn Sie sich nur mit dem NaN-Wert beschäftigen, habe ich nach einer schnelleren Option gesucht, da nach meiner Erfahrung das Summieren von flachen Arrays (seltsamerweise) schneller ist als das Zählen. Dieser Code scheint schneller zu sein:

df.isnull().values.any()

Zum Beispiel:

In [2]: df = pd.DataFrame(np.random.randn(1000,1000))

In [3]: df[df > 0.9] = pd.np.nan

In [4]: %timeit df.isnull().any().any()
100 loops, best of 3: 14.7 ms per loop

In [5]: %timeit df.isnull().values.sum()
100 loops, best of 3: 2.15 ms per loop

In [6]: %timeit df.isnull().sum().sum()
100 loops, best of 3: 18 ms per loop

In [7]: %timeit df.isnull().values.any()
1000 loops, best of 3: 948 µs per loop
1
ankur09011

Wenn Sie in einer bestimmten Spalte nach den Indizes für NaN suchen, können Sie diese verwenden

list(df['B'].index[df['B'].apply(np.isnan)])

Wenn Sie die Indizes aller möglichen NaN-Werte im Datenrahmen abrufen möchten, können Sie Folgendes tun

row_col_indexes = list(map(list, np.where(np.isnan(np.array(df)))))
indexes = []
for i in Zip(row_col_indexes[0], row_col_indexes[1]):
    indexes.append(list(i))

Und wenn Sie nach einem Einliner suchen, können Sie Folgendes verwenden:

list(Zip(*[x for x in list(map(list, np.where(np.isnan(np.array(df)))))]))
0
Loochie