174 votes

Filtrez la colonne du dataframe Pyspark avec la valeur None.

J'essaye de filtrer un cadre de données PySpark qui a None comme valeur de ligne :

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

et je peux filtrer correctement avec une valeur de type chaîne :

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

mais cela échoue :

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

Mais il y a définitivement des valeurs dans chaque catégorie. Qu'est-ce qui se passe ?

1 votes

Vous voulez en fait filtrer les lignes avec des valeurs nulles, et non une colonne avec des valeurs nulles. Le titre peut être trompeur.

0 votes

En bref, une comparaison impliquant null (ou None, dans ce cas) renvoie toujours false. En particulier, la comparaison (null == null) renvoie un résultat faux. De même, la comparaison (None == None) renvoie un résultat faux.

309voto

zero323 Points 5699

Vous pouvez utiliser Column.isNull / Column.isNotNull :

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

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

Si vous voulez simplement laisser tomber NULL vous pouvez utiliser les valeurs suivantes na.drop con subset argument :

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

Comparaisons fondées sur l'égalité avec NULL ne fonctionnera pas car en SQL NULL est indéfinie, donc toute tentative de comparaison avec une autre valeur retourne NULL :

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

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

La seule méthode valable pour comparer une valeur avec NULL es IS / IS NOT qui sont équivalentes à la isNull / isNotNull appels de méthodes.

2 votes

Génial, merci. Je pensais que ces filtres sur les dataframes PySpark seraient plus "pythoniques", mais hélas, ils ne le sont pas. Je pense demander aux développeurs à ce sujet.

1 votes

En fait, c'est assez pythique. Vous ne devriez jamais vérifier __eq__ avec Aucun ;) Et is ne fonctionnerait pas car il ne se comporte pas de la même manière.

2 votes

Bizarrement, cela ne fonctionne que pour les colonnes de type chaîne... Il semble que df.filter("dt_mvmt is not NULL") gère les deux.

47voto

Anthony Points 178

Essayez d'utiliser simplement isNotNull fonction.

df.filter(df.dt_mvmt.isNotNull()).count()

22voto

timctran Points 311

Pour obtenir les entrées dont les valeurs dans le dt_mvmt ne sont pas nuls, nous avons

df.filter("dt_mvmt is not NULL")

et pour les entrées qui sont nulles, on a

df.filter("dt_mvmt is NULL")

9voto

neeraj bhadani Points 664

Il existe plusieurs façons de supprimer/filtrer les valeurs nulles d'une colonne dans un DataFrame.

Créons un simple DataFrame avec le code ci-dessous :

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

Vous pouvez maintenant essayer l'une des approches suivantes pour filtrer les valeurs nulles.

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

Vous pouvez également consulter la section "Working with NULL Values" sur mon site Web. blog pour plus d'informations.

J'espère que cela vous aidera.

7voto

Gourav Bansal Points 69

IsNull()/isNotNull() renverront les lignes respectives qui ont dt_mvmt comme Null ou !Null.

method_1 = df.filter(df['dt_mvmt'].isNotNull()).count()
method_2 = df.filter(df.dt_mvmt.isNotNull()).count()

Les deux renverront le même résultat

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X