it-swarm.com.de

Python-Pandas Filtern von nan aus einer Datenauswahl einer Stringsäule

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.

103
ccsv

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

150
EdChum

Einfachste aller Lösungen:

filtered_df = df[df['name'].notnull()]

Daher werden nur Zeilen herausgefiltert, die keine NaN-Werte in der Spalte "Name" enthalten.

105
Gil Baggio
df.dropna(subset=['columnName1', 'columnName2'])
3
JacoSolari
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])]
1
Bashar Mohammad