कोई भी मान से Pyspark डेटाफ़ॉर्म कॉलम फ़िल्टर नहीं करें


98

मैं एक PySpark डेटाफ़्रेम को फ़िल्टर करने का प्रयास कर रहा हूं Noneजिसमें पंक्ति मूल्य है:

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

लेकिन प्रत्येक श्रेणी पर निश्चित रूप से मूल्य हैं। क्या चल रहा है?


आप वास्तव में अशक्त मूल्यों के साथ पंक्तियों को फ़िल्टर करना चाहते हैं, न कि किसी भी मान के साथ एक स्तंभ। शीर्षक भ्रामक हो सकता है।
14

संक्षेप में, नल (या इस मामले में कोई नहीं) से तुलनात्मक तुलना हमेशा झूठी होती है। विशेष रूप से, तुलना (अशक्त == अशक्त) झूठी हो जाती है। साथ ही, तुलना (कोई नहीं == कोई नहीं) झूठी है।
रिचर्ड गोम्स

जवाबों:


202

आप उपयोग कर सकते हैं 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एसक्यूएल 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 डेटाफ्रेम पर ये फिल्टर अधिक "पायथोनिक" होंगे, लेकिन अफसोस, वे नहीं हैं। मैं देवताओं से इस बारे में पूछने पर विचार कर रहा हूं।
इवान

1
दरअसल यह काफी पाइथोनिक है। आपको कभी __eq__भी किसी के साथ जाँच नहीं करनी चाहिए ;) और isकाम नहीं करेगा क्योंकि यह उसी तरह व्यवहार नहीं करता है।
शून्य 323

2
अजीब तरह से यह केवल स्ट्रिंग कॉलम के लिए काम करता है ... ऐसा लगता है जैसे df.filter("dt_mvmt is not NULL")दोनों संभालती है।
डेविड ऐरनबर्ग


14

उन प्रविष्टियों को प्राप्त करने के लिए जिनके मूल्य में dt_mvmt कॉलम शून्य नहीं हैं

df.filter("dt_mvmt is not NULL")

और प्रविष्टियों के लिए जो हमारे पास शून्य हैं

df.filter("dt_mvmt is NULL")

2

यदि आप पंडों के सिंटेक्स के साथ रखना चाहते हैं तो यह मेरे लिए काम करता है।

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 बनाएं:

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.

आप मेरे ब्लॉग पर "वर्किंग विद नाल वैल्यूज़" सेक्शन भी देख सकते हैंअधिक जानकारी के लिए आप ।

मुझे उम्मीद है यह मदद करेगा।


0

PySpark अंकगणित, तार्किक और अन्य स्थितियों के आधार पर विभिन्न फ़िल्टरिंग विकल्प प्रदान करता है। पूर्ण मूल्यों की उपस्थिति आगे की प्रक्रियाओं में बाधा डाल सकती है। उन्हें हटाना या सांख्यिकीय रूप से उन्हें थोपना एक विकल्प हो सकता है।

नीचे दिए गए कोड के सेट पर विचार किया जा सकता है:

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

अब शून्य मान रिकॉर्ड फ़िल्टर करें:

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

df.show()

यदि आप उन अभिलेखों को DF से हटाना चाहते हैं तो नीचे देखें:

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

df1.show()

0

कोई नहीं / Null pyspark / python में कक्षा NoType का डेटा प्रकार है, इसलिए नीचे दिए गए काम नहीं करेंगे क्योंकि आप स्ट्रिंग ऑब्जेक्ट के साथ NoType ऑब्जेक्ट की तुलना करने का प्रयास कर रहे हैं

फिल्मांकन का गलत तरीका

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

सही बात

df = df.where (कॉल ("dt_mvmt")। isNotNull ()) dt_mvmt के साथ सभी रिकॉर्ड्स को कोई नहीं / शून्य के रूप में लौटाता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.