Ohne groupby
wie würde ich Daten ohne NaN
herausfiltern?
Nehmen wir an, ich habe eine Matrix, in der die Kunden 'N/A', 'n/a' oder eine ihrer Variationen ausfüllen und andere leer lassen:
import pandas as pd
import numpy as np
df = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],
'rating': [3., 4., 5., np.nan, np.nan, np.nan],
'name': ['John', np.nan, 'N/A', 'Graham', np.nan, np.nan]})
nbs = df['name'].str.extract('^(N/A|NA|na|n/a)')
nms=df[(df['name'] != nbs) ]
ausgabe:
>>> nms
movie name rating
0 thg John 3
1 thg NaN 4
3 mol Graham NaN
4 lob NaN NaN
5 lob NaN NaN
Wie würde ich NaN-Werte herausfiltern, damit ich mit den folgenden Ergebnissen arbeiten kann:
movie name rating
0 thg John 3
3 mol Graham NaN
Ich schätze, ich brauche etwas wie ~np.isnan
, aber die Tilda arbeitet nicht mit Strings.
Lass sie einfach fallen:
nms.dropna(thresh=2)
dadurch werden alle Zeilen gelöscht, in denen mindestens zwei nicht -NaN
vorhanden sind.
dann könnten Sie dort ablegen, wo der Name NaN
ist:
In [87]:
nms
Out[87]:
movie name rating
0 thg John 3
1 thg NaN 4
3 mol Graham NaN
4 lob NaN NaN
5 lob NaN NaN
[5 rows x 3 columns]
In [89]:
nms = nms.dropna(thresh=2)
In [90]:
nms[nms.name.notnull()]
Out[90]:
movie name rating
0 thg John 3
3 mol Graham NaN
[2 rows x 3 columns]
EDIT
Wenn Sie sich das anschauen, was Sie ursprünglich möchten, können Sie dies auch ohne den Aufruf von dropna
tun:
nms[nms.name.notnull()]
UPDATE
Betrachtet man diese Frage 3 Jahre später, so gibt es einen Fehler. Erstens sucht thresh
arg nach leas n
nicht -NaN
-Werten.
In [4]:
nms.dropna(thresh=2)
Out[4]:
movie name rating
0 thg John 3.0
1 thg NaN 4.0
3 mol Graham NaN
Es ist möglich, dass ich mich vor drei Jahren entweder geirrt hatte oder dass die Version der Pandas, die ich ausführte, einen Fehler hatte. Beide Szenarien sind durchaus möglich
Einfachste aller Lösungen:
filtered_df = df[df['name'].notnull()]
Daher werden nur Zeilen herausgefiltert, die keine NaN-Werte in der Spalte "Name" enthalten.
df.dropna(subset=['columnName1', 'columnName2'])
df = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],'rating': [3., 4., 5., np.nan, np.nan, np.nan],'name': ['John','James', np.nan, np.nan, np.nan,np.nan]})
for col in df.columns:
df = df[~pd.isnull(df[col])]