Filtern Sie die Pyspark-Datenrahmenspalte mit dem Wert None

97

Ich versuche, einen PySpark-Datenrahmen mit einem Zeilenwert zu filtern None:

df.select('dt_mvmt').distinct().collect()

[Row(dt_mvmt=u'2016-03-27'),
 Row(dt_mvmt=u'2016-03-28'),
 Row(dt_mvmt=u'2016-03-29'),
 Row(dt_mvmt=None),
 Row(dt_mvmt=u'2016-03-30'),
 Row(dt_mvmt=u'2016-03-31')]

und ich kann mit einem String-Wert richtig filtern:

df[df.dt_mvmt == '2016-03-31']
# some results here

aber das schlägt fehl:

df[df.dt_mvmt == None].count()
0
df[df.dt_mvmt != None].count()
0

Aber es gibt definitiv Werte für jede Kategorie. Was ist los?

Ivan
quelle
Sie möchten tatsächlich Zeilen mit Nullwerten filtern, keine Spalte mit Keine-Werten. Der Titel könnte irreführend sein.
Atorpat
Kurz gesagt, ein Vergleich mit null (oder in diesem Fall mit None) gibt immer false zurück. Insbesondere gibt der Vergleich (null == null) false zurück. Außerdem gibt der Vergleich (None == None) false zurück.
Richard Gomes

Antworten:

201

Sie können Column.isNull/ verwenden Column.isNotNull:

df.where(col("dt_mvmt").isNull())

df.where(col("dt_mvmt").isNotNull())

Wenn Sie fallen einfach wollen NULLWerte können Sie verwenden , na.dropmit subsetArgument:

df.na.drop(subset=["dt_mvmt"])

Gleichheitsbasierte Vergleiche mit NULLfunktionieren nicht, da in SQL NULLundefiniert ist und jeder Versuch, sie mit einem anderen Wert zu vergleichen, Folgendes zurückgibt NULL:

sqlContext.sql("SELECT NULL = NULL").show()
## +-------------+
## |(NULL = NULL)|
## +-------------+
## |         null|
## +-------------+


sqlContext.sql("SELECT NULL != NULL").show()
## +-------------------+
## |(NOT (NULL = NULL))|
## +-------------------+
## |               null|
## +-------------------+

Die einzig gültige Methode zum Vergleichen von Werten NULList IS/, IS NOTdie den isNull/ isNotNullmethod-Aufrufen entspricht.

null323
quelle
2
Super, danke. Ich dachte, dass diese Filter in PySpark-Datenrahmen "pythonischer" wären, aber leider nicht. Ich denke darüber nach, die Entwickler danach zu fragen.
Ivan
1
Eigentlich ist es ziemlich pythonisch. Du solltest dich niemals __eq__bei None erkundigen;) Und iswürde nicht funktionieren, weil es sich nicht so verhält.
Null 323
2
Seltsamerweise funktioniert dies nur für Zeichenfolgenspalten ... Es scheint, als würden df.filter("dt_mvmt is not NULL")beide behandelt.
David Arenburg
31

Versuchen Sie einfach die Funktion isNotNull zu verwenden.

df.filter(df.dt_mvmt.isNotNull()).count()
Anthony
quelle
14

Um Einträge zu erhalten, deren Werte in der dt_mvmtSpalte nicht null sind, haben wir

df.filter("dt_mvmt is not NULL")

und für Einträge, die null sind, haben wir

df.filter("dt_mvmt is NULL")
timctran
quelle
2

Wenn du mit dem Pandas Syntex bleiben willst, hat das bei mir funktioniert.

df = df[df.dt_mvmt.isNotNull()]
Rae
quelle
1

wenn Spalte = Keine

COLUMN_OLD_VALUE
----------------
None
1
None
100
20
------------------

Verwenden Sie erstellen Sie einen verlockenden Datenrahmen:

sqlContext.sql("select * from tempTable where column_old_value='None' ").show()

Verwenden Sie also: column_old_value='None'

user10238559
quelle
1

Es gibt mehrere Möglichkeiten, wie Sie die Nullwerte aus einer Spalte in DataFrame entfernen / filtern können.

Erstellen wir einen einfachen DataFrame mit dem folgenden Code:

date = ['2016-03-27','2016-03-28','2016-03-29', None, '2016-03-30','2016-03-31']
df = spark.createDataFrame(date, StringType())

Jetzt können Sie einen der folgenden Ansätze ausprobieren, um die Nullwerte herauszufiltern.

# Approach - 1
df.filter("value is not null").show()

# Approach - 2
df.filter(col("value").isNotNull()).show()

# Approach - 3
df.filter(df["value"].isNotNull()).show()

# Approach - 4
df.filter(df.value.isNotNull()).show()

# Approach - 5
df.na.drop(subset=["value"]).show()

# Approach - 6
df.dropna(subset=["value"]).show()

# Note: You can also use where function instead of a filter.

Weitere Informationen finden Sie auch im Abschnitt "Arbeiten mit NULL-Werten" in meinem Blog .

Ich hoffe, es hilft.

neeraj bhadani
quelle
0

PySpark bietet verschiedene Filteroptionen basierend auf arithmetischen, logischen und anderen Bedingungen. Das Vorhandensein von NULL-Werten kann weitere Prozesse behindern. Sie zu entfernen oder statistisch zu unterstellen, könnte eine Wahl sein.

Der folgende Codesatz kann berücksichtigt werden:

# Dataset is df
# Column name is dt_mvmt
# Before filtering make sure you have the right count of the dataset
df.count() # Some number

# Filter here
df = df.filter(df.dt_mvmt.isNotNull())

# Check the count to ensure there are NULL values present (This is important when dealing with large dataset)
df.count() # Count should be reduced if NULL values are present
Swaminathan Meenakshisundaram
quelle
0

Ich würde auch versuchen:

df = df.dropna(subset=["dt_mvmt"])

information_interchange
quelle
0

Wenn Sie Datensätze mit dem Wert None in der Spalte herausfiltern möchten, sehen Sie das folgende Beispiel:

df=spark.createDataFrame([[123,"abc"],[234,"fre"],[345,None]],["a","b"])

Filtern Sie nun Nullwertdatensätze heraus:

df=df.filter(df.b.isNotNull())

df.show()

Wenn Sie diese Datensätze aus DF entfernen möchten, sehen Sie unten:

df1=df.na.drop(subset=['b'])

df1.show()
Yogesh
quelle
0

None / Null ist ein Datentyp der Klasse NoneType in pyspark / python. Daher funktioniert Below nicht, wenn Sie versuchen, das NoneType-Objekt mit dem Zeichenfolgenobjekt zu vergleichen

Falsche Art zu filtern

df [df.dt_mvmt == None] .count () 0 df [df.dt_mvmt! = None] .count () 0

richtig

df = df.where (col ("dt_mvmt"). isNotNull ()) gibt alle Datensätze mit dt_mvmt als None / Null zurück

Rajashekar Reddy Peta
quelle