없음 값으로 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.