python - example - spark 2.3 6
Filtrar la columna del marco de datos Pyspark con el valor Ninguno (7)
Estoy tratando de filtrar un marco de datos PySpark que tiene
None
como 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?
Intenta usar la función isNotNull .
df.filter(df.dt_mvmt.isNotNull()).count()
Para obtener entradas cuyos valores en la columna
dt_mvmt
no son nulos, tenemos
df.filter("dt_mvmt is not NULL")
y para entradas que son nulas tenemos
df.filter("dt_mvmt is NULL")
Puede usar
Column.isNull
/
Column.isNotNull
:
df.where(col("dt_mvmt").isNull())
df.where(col("dt_mvmt").isNotNull())
Si desea simplemente soltar valores
NULL
, puede usar
na.drop
con argumento de
subset
:
df.na.drop(subset=["dt_mvmt"])
Las comparaciones basadas en la igualdad con
NULL
no funcionarán porque en SQL
NULL
no 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 con
NULL
es
IS
/
IS NOT
que son equivalentes a las llamadas al método
isNull
/
isNotNull
.
PySpark proporciona varias opciones de filtrado basadas en condiciones aritméticas, lógicas y de otro tipo. La presencia de valores NULL puede dificultar otros procesos. Eliminarlos o imputarlos estadísticamente podría ser una opción.
A continuación se puede considerar el 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
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 valores nulos:
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()
También intentaría:
df = df.dropna(subset=["dt_mvmt"])
si columna = Ninguno
COLUMN_OLD_VALUE
----------------
None
1
None
100
20
------------------
Utilice crear un marco de datos tentable en:
sqlContext.sql("select * from tempTable where column_old_value=''None'' ").show()
Entonces use:
column_old_value=''None''