ফিল্টার পাইপার্ক ডাটাফ্রেম কলামের সাথে কোনও মান নেই


105

আমি একটি পাইস্পার্ক ডেটা ফ্রেম ফিল্টার করার চেষ্টা করছি যার 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

তবে প্রতিটি বিভাগে অবশ্যই মান আছে। কি হচ্ছে?


আপনি আসলে নাল মান সহ সারিগুলি ফিল্টার করতে চান, কোনও মান নেই এমন কলাম নয়। শিরোনাম বিভ্রান্তিকর হতে পারে।
আটোরপট

সংক্ষেপে, নালকে জড়িত একটি তুলনা (বা এই ক্ষেত্রে কিছুই নয়) সর্বদা মিথ্যা দেয়। বিশেষত, তুলনা (নাল == নাল) মিথ্যা প্রত্যাবর্তন করে। এছাড়াও, তুলনা (কোনওটি নয় == কিছুই নয়) মিথ্যা প্রত্যাবর্তন করে।
রিচার্ড গোমেস

উত্তর:


218

আপনি 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পদ্ধতি কল।


4
অান্তরিক ধন্যবাদ. আমি ভেবেছিলাম যে পাইস্পার্ক ডেটাফ্রেমে এই ফিল্টারগুলি আরও "পাইথোনিক" হবে তবে হায় আফসোস তারা তা নয়। আমি এই সম্পর্কে devs জিজ্ঞাসা চিন্তা করছি।
ইভান

4
আসলে এটি বেশ পাইথনিক। আপনার কখনই কারও সাথে চেক করা উচিত __eq__নয়;) এবং isকাজ করবে না কারণ এটি একইভাবে আচরণ করে না।
শূন্য323

4
আশ্চর্যজনকভাবে এটি কেবল স্ট্রিং কলামগুলির জন্যই কাজ করে ... দেখে মনে হচ্ছে এটি df.filter("dt_mvmt is not NULL")উভয়ই হ্যান্ডল করে।
ডেভিড আরেনবুর্গ


15

dt_mvmtকলামের মানগুলি শূন্য নয় এমন এন্ট্রিগুলি অর্জন করতে

df.filter("dt_mvmt is not NULL")

এবং এন্ট্রিগুলির জন্য যা আমাদের কাছে শূন্য

df.filter("dt_mvmt is NULL")

2

আপনি যদি পান্ডাদের সিনটেক্সের সাথে রাখতে চান তবে এটি আমার জন্য কাজ করেছে।

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

2

ডেটাফ্রেমের কোনও কলাম থেকে নাল মানগুলি মুছে ফেলার / ফিল্টার করার একাধিক উপায় রয়েছে।

নীচের কোড সহ একটি সাধারণ ডেটা ফ্রেম তৈরি করতে দেয়:

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.

আপনি আমার ব্লগে "নূন্য মূল্যবোধের সাথে কাজ করা" বিভাগটিও পরীক্ষা করতে পারেনআরও তথ্যের জন্য আপনি ।

আমি আসা করি এটা সাহায্য করবে.


1

if কলাম = কোনটি নয়

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

ডেটা ফ্রেমে একটি লোভনীয় তৈরি ব্যবহার করুন:

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

সুতরাং ব্যবহার করুন: column_old_value='None'


0

পাইসপার্ক গাণিতিক, যৌক্তিক এবং অন্যান্য অবস্থার উপর ভিত্তি করে বিভিন্ন ফিল্টারিং বিকল্প সরবরাহ করে। নুল মানগুলির উপস্থিতি আরও প্রক্রিয়াগুলিকে বাধা দিতে পারে। তাদের অপসারণ বা পরিসংখ্যানগতভাবে তাদের অভিব্যক্ত করা পছন্দ হতে পারে।

নীচে কোড সেট বিবেচনা করা যেতে পারে:

# 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()

আপনি যদি ডিএফ থেকে এই রেকর্ডগুলি সরাতে চান তবে নীচে দেখুন:

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

df1.show()

0

নাইন্ড / নাল ক্লাসের ডেটা টাইপ পাইসপার্ক / পাইথনে ন্যানটাইপ সুতরাং, নীচে আপনি স্ট্রিং অবজেক্টের সাথে নাই টাইপ অবজেক্টের তুলনা করার চেষ্টা করছেন বলে কাজ করবে না

ছাঁটাইয়ের ভুল উপায়

ডিএফ [df.dt_mvmt == কিছুই নয়]। গণনা () 0 ডিএফ [df.dt_mvmt! = কিছুই নয়]। অ্যাকাউন্ট () 0

সঠিক

df = df.where (col ("dt_mvmt")। isNotNull ()) dt_mvmt সহ সমস্ত রেকর্ডকে কেউ / নাল হিসাবে ফিরিয়ে দেয়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.