없음 값으로 Pyspark 데이터 프레임 열 필터링


100

None행 값 이있는 PySpark 데이터 프레임을 필터링하려고 합니다.

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

그러나 각 카테고리에는 확실히 가치가 있습니다. 무슨 일이야?


실제로는 None 값이있는 열이 아니라 null 값이있는 행을 필터링하려고합니다. 제목이 오해의 소지가 있습니다.
Atorpat

간단히 말해서 null (또는이 경우 None)을 포함하는 비교는 항상 false를 반환합니다. 특히 비교 (null == null)는 false를 반환합니다. 또한 비교 (None == None)는 false를 반환합니다.
Richard Gomes

답변:


204

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

NULLSQL 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메소드 호출.


2
감사합니다. 나는 PySpark 데이터 프레임의 이러한 필터가 더 "pythonic"이라고 생각했지만 아쉽게도 그렇지 않습니다. 개발자들에게 이것에 대해 물어볼 생각입니다.
Ivan

1
사실 그것은 아주 파이썬 적입니다. __eq__None으로 확인해서는 안됩니다 .) 그리고 is동일한 방식으로 작동하지 않기 때문에 작동하지 않습니다.
zero323

2
이상하게도 이것은 문자열 열에서만 작동합니다 ... df.filter("dt_mvmt is not NULL")둘 다 처리하는 것 같습니다 .
David Arenburg


14

dt_mvmt열의 값 이 null이 아닌 항목을 얻으려면

df.filter("dt_mvmt is not NULL")

null 인 항목의 경우

df.filter("dt_mvmt is NULL")

2

Pandas syntex를 유지하고 싶다면 이것은 나를 위해 일했습니다.

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

1

열 = 없음 인 경우

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

데이터 프레임에 임시 테이블 만들기를 사용하십시오.

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

그래서 사용하십시오 : column_old_value='None'


1

DataFrame의 열에서 null 값을 제거 / 필터링 할 수있는 여러 가지 방법이 있습니다.

아래 코드로 간단한 DataFrame을 만들 수 있습니다.

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

이제 아래 방법 중 하나를 시도하여 null 값을 필터링 할 수 있습니다.

# 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 값으로 작업"섹션을 확인할 수도 있습니다 .

도움이되기를 바랍니다.


0

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


0

열에 없음 값이있는 레코드를 필터링하려면 아래 예를 참조하십시오.

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

이제 null 값 레코드를 필터링합니다.

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

df.show()

DF에서 해당 레코드를 제거하려면 아래를 참조하십시오.

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

df1.show()

0

None / Null은 pyspark / python의 NoneType 클래스의 데이터 유형이므로 NoneType 개체를 문자열 개체와 비교하려고 할 때 아래가 작동하지 않습니다.

잘못된 여과 방법

df [df.dt_mvmt == 없음] .count () 0 df [df.dt_mvmt! = 없음] .count () 0

옳은

df = df.where (col ( "dt_mvmt"). isNotNull ())은 dt_mvmt가 None / Null 인 모든 레코드를 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.