Pyspark veri çerçevesi sütununu Yok değeriyle filtrele


106

NoneSatır değeri olan bir PySpark veri çerçevesini filtrelemeye çalışıyorum :

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

ve bir dize değeriyle doğru şekilde filtreleyebilirim:

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

ancak bu başarısız olur:

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

Ancak her kategoride kesinlikle değerler vardır. Neler oluyor?


Aslında, Yok değerleri olan bir sütunu değil, boş değerli satırları filtrelemek istiyorsunuz. Başlık yanıltıcı olabilir.
Atorpat

Özetle, null (veya bu durumda Yok) içeren bir karşılaştırma her zaman yanlış döndürür. Özellikle, karşılaştırma (null == null) yanlış döndürür. Ayrıca, karşılaştırma (Yok == Yok) yanlış döndürür.
Richard Gomes

Yanıtlar:


223

Column.isNull/ Kullanabilirsiniz Column.isNotNull:

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

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

NULLDeğerleri basitçe bırakmak istiyorsanız, bağımsız değişkenle na.dropbirlikte kullanabilirsiniz subset:

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

İle eşitlik tabanlı karşılaştırmalar NULLişe yaramayacaktır çünkü SQL'de NULLtanımsızdır, bu nedenle onu başka bir değerle karşılaştırma girişimleri şunu döndürür NULL:

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


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

İle değerini karşılaştırmak için tek geçerli bir yöntem NULLolup IS/ IS NOTeşdeğer olan isNull/ isNotNullyöntem çağrıları.


2
Harika, teşekkürler. PySpark veri çerçevelerindeki bu filtrelerin daha "pitonik" olacağını düşündüm, ama ne yazık ki değiller. Geliştiricilere bunu sormayı düşünüyorum.
Ivan

1
Aslında oldukça Pythonic. __eq__Hiçbiri ile asla kontrol etmemelisiniz ;) Ve isişe yaramaz çünkü aynı şekilde davranmaz.
zero323

2
Garip bir şekilde bu sadece string sütunlar için çalışıyor ... Her df.filter("dt_mvmt is not NULL")ikisini de işliyor gibi görünüyor .
David Arenburg


16

dt_mvmtSütundaki değerleri boş olmayan girişleri elde etmek için elimizde

df.filter("dt_mvmt is not NULL")

ve boş olan girişler için

df.filter("dt_mvmt is NULL")

2

Pandas sözdizimine uymak istiyorsanız, bu benim için çalıştı.

df = df[df.dt_mvmt.isNotNull()]

2

DataFrame'deki bir sütundan boş değerleri kaldırmanın / filtrelemenin birden çok yolu vardır.

Aşağıdaki kodla basit bir DataFrame oluşturalım:

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

Şimdi, boş değerleri filtrelemek için aşağıdaki yaklaşımlardan birini deneyebilirsiniz.

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

Ayrıca benim üzerinde "BOŞ Değerleri ile Çalışma" bölümünü kontrol edebilirsiniz blogda daha fazla bilgi için.

Umut ediyorum bu yardım eder.


1

sütun = Yok ise

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

Veri çerçevesi üzerinde cazip bir şey oluşturun:

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

Öyleyse kullan: column_old_value='None'


0

PySpark aritmetik, mantıksal ve diğer koşullara göre çeşitli filtreleme seçenekleri sunar. NULL değerlerin varlığı, diğer işlemleri engelleyebilir. Bunları kaldırmak veya istatistiksel olarak isnat etmek bir seçim olabilir.

Aşağıdaki kod seti düşünülebilir:

# 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


0

Sütunda Yok değeri olan kayıtları filtrelemek istiyorsanız, aşağıdaki örneğe bakın:

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

Şimdi boş değer kayıtlarını filtreleyin:

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

df.show()

Bu kayıtları DF'den kaldırmak istiyorsanız aşağıya bakın:

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

df1.show()

0

None / Null, pyspark / python'daki NoneType sınıfının bir veri türüdür, dolayısıyla aşağıda NoneType nesnesini string nesnesiyle karşılaştırmaya çalışırken çalışmayacaktır.

Yanlış dosyalama yolu

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

doğru

df = df.where (col ("dt_mvmt"). isNotNull ()), dt_mvmt olan tüm kayıtları Yok / Boş olarak döndürür


0

isNull () / isNotNull (), dt_mvmt değeri Null veya! Null olan ilgili satırları döndürecektir.

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

Her ikisi de aynı sonucu döndürecektir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.