簡體   English   中英

使用 None 值過濾 Pyspark dataframe 列

[英]Filter Pyspark dataframe column with None value

我正在嘗試過濾行值為None的 PySpark dataframe:

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

我可以使用字符串值正確過濾:

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

但這失敗了:

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

但是每個類別肯定都有值。 這是怎么回事?

您可以使用Column.isNull / Column.isNotNull

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

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

如果你想簡單地刪除NULL值,你可以使用na.dropsubset參數:

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

NULL基於相等的比較將不起作用,因為在 SQL 中NULL是未定義的,因此任何將其與另一個值進行比較的嘗試都會返回NULL

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


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

將值與NULL進行比較的唯一有效方法是IS / IS NOT ,它們等效於isNull / isNotNull方法調用。

嘗試只使用isNotNull函數。

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

要獲取dt_mvmt列中的值不為空的條目,我們有

df.filter("dt_mvmt is not NULL")

對於空條目,我們有

df.filter("dt_mvmt is NULL")

有多種方法可以從 DataFrame 的列中刪除/過濾空值。

讓我們使用以下代碼創建一個簡單的 DataFrame:

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

現在您可以嘗試以下方法之一來過濾掉空值。

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

您還可以查看我博客上的“使用 NULL 值”部分以獲取更多信息。

我希望它有幫助。

如果列 = 無

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

使用在數據框上創建一個臨時表:

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

所以使用: column_old_value='None'

如果你想保持 Pandas 語法,這對我有用。

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

isNull()/isNotNull() 將返回具有 dt_mvmt 為 Null 或 !Null 的相應行。

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

兩者都將返回相同的結果

PySpark 提供了基於算術、邏輯和其他條件的各種過濾選項。 NULL 值的存在會妨礙進一步的處理。 刪除它們或統計它們可能是一種選擇。

可以考慮以下代碼集:

# 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

我也會嘗試:

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

如果要過濾掉列中具有 None 值的記錄,請參見以下示例:

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

現在過濾掉空值記錄:

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

df.show()

如果您想從 DF 中刪除這些記錄,請參見下文:

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

df1.show()

None/Null 是 pyspark/python 中 NoneType 類的數據類型,因此,當您嘗試將 NoneType 對象與字符串對象進行比較時,下面將不起作用

錯誤的過濾方式

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

正確

df=df.where(col("dt_mvmt").isNotNull()) 返回所有 dt_mvmt 為 None/Null 的記錄

 df.filter(df.column_name.isNotNull()).display()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM