[英]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.drop
和subset
參數:
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.