Filtrar la columna de marco de datos de Pyspark con valor Ninguno

100

Estoy tratando de filtrar un marco de datos PySpark que tiene Nonecomo valor de fila:

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')]

y puedo filtrar correctamente con un valor de cadena:

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

pero esto falla:

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

Pero definitivamente hay valores en cada categoría. ¿Que esta pasando?

Iván
fuente
En realidad, desea filtrar filas con valores nulos, no una columna con valores Ninguno. El título puede inducir a error.
Atorpat
En pocas palabras, una comparación que involucra nulo (o Ninguno, en este caso) siempre devuelve falso. En particular, la comparación (nulo == nulo) devuelve falso. Además, la comparación (Ninguno == Ninguno) devuelve falso.
Richard Gomes

Respuestas:

204

Puede usar Column.isNull/ Column.isNotNull:

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

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

Si desea simplemente eliminar NULLvalores, puede usar na.dropcon subsetargumento:

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

Las comparaciones basadas en la igualdad con NULLno funcionarán porque en SQL NULLno está definido, por lo que cualquier intento de compararlo con otro valor devuelve NULL:

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


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

El único método válido para comparar el valor NULLes IS/ IS NOTque es equivalente a las llamadas al método isNull/ isNotNull.

zero323
fuente
2
Genial gracias. Pensé que estos filtros en los marcos de datos de PySpark serían más "pitónicos", pero, por desgracia, no lo son. Estoy pensando en preguntarles a los desarrolladores sobre esto.
Ivan
1
De hecho, es bastante pitónico. Nunca debe verificar __eq__con Ninguno;) Y isno funcionaría porque no se comporta de la misma manera.
zero323
2
Curiosamente, esto solo funciona para columnas de cadena ... Parece que df.filter("dt_mvmt is not NULL")maneja ambos.
David Arenburg
31

Intente usar la función isNotNull .

df.filter(df.dt_mvmt.isNotNull()).count()
Antonio
fuente
14

Para obtener entradas cuyos valores en la dt_mvmtcolumna no sean nulos tenemos

df.filter("dt_mvmt is not NULL")

y para las entradas que son nulas tenemos

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

Si quieres seguir con el syntex de Pandas, esto funcionó para mí.

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

si columna = Ninguno

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

Utilice crear un marco de datos tentador:

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

Entonces usa: column_old_value='None'

usuario10238559
fuente
1

Hay varias formas de eliminar / filtrar los valores nulos de una columna en DataFrame.

Creemos un DataFrame simple con el siguiente código:

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

Ahora puede probar uno de los métodos siguientes para filtrar los valores nulos.

# 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.

También puede consultar la sección "Trabajar con valores nulos" en mi blog para obtener más información.

Espero que ayude.

neeraj bhadani
fuente
0

PySpark proporciona varias opciones de filtrado basadas en condiciones aritméticas, lógicas y de otro tipo. La presencia de valores NULL puede obstaculizar procesos posteriores. Eliminarlos o imputarlos estadísticamente podría ser una opción.

Se puede considerar el siguiente conjunto de códigos:

# 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
fuente
0

También probaría:

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

intercambio_información
fuente
0

Si desea filtrar los registros que tienen el valor Ninguno en la columna, consulte el siguiente ejemplo:

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

Ahora filtre los registros de valor nulo:

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

df.show()

Si desea eliminar esos registros de DF, consulte a continuación:

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

df1.show()
yogesh
fuente
0

None / Null es un tipo de datos de la clase NoneType en pyspark / python, por lo que A continuación no funcionará ya que está tratando de comparar el objeto NoneType con el objeto string

Forma incorrecta de filtrar

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

correcto

df = df.where (col ("dt_mvmt"). isNotNull ()) devuelve todos los registros con dt_mvmt como None / Null

Rajashekar Reddy Peta
fuente