পাইথন পান্ডাস স্ট্রিংগুলির একটি কলামের ডেটা নির্বাচন থেকে নান ফিল্টার আউট


190

ব্যবহার না করে groupbyআমি কীভাবে ডেটা ফিল্টার করব NaN?

ধরা যাক আমার একটি ম্যাট্রিক্স রয়েছে যেখানে গ্রাহকরা 'এন / এ', 'এন / এ' বা এর কোনও প্রকারেরতা পূরণ করবেন এবং অন্যরা এটিকে ফাঁকা ছেড়ে দেবে:

import pandas as pd
import numpy as np


df = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],
                  'rating': [3., 4., 5., np.nan, np.nan, np.nan],
                  'name': ['John', np.nan, 'N/A', 'Graham', np.nan, np.nan]})

nbs = df['name'].str.extract('^(N/A|NA|na|n/a)')
nms=df[(df['name'] != nbs) ]

আউটপুট:

>>> nms
  movie    name  rating
0   thg    John       3
1   thg     NaN       4
3   mol  Graham     NaN
4   lob     NaN     NaN
5   lob     NaN     NaN

আমি কীভাবে NaN মানগুলি ফিল্টার করব যাতে আমি এর সাথে কাজ করতে ফলাফল পেতে পারি:

  movie    name  rating
0   thg    John       3
3   mol  Graham     NaN

আমি অনুমান করছি আমার মতো কিছু দরকার ~np.isnanতবে টিল্ডা স্ট্রিং দিয়ে কাজ করে না।

উত্তর:


254

কেবল এগুলি ফেলে দিন:

nms.dropna(thresh=2)

এটি এমন সমস্ত সারি বাদ দেবে যেখানে কমপক্ষে দু'জন নন- রয়েছে NaN

তারপরে আপনি নামটি যেখানে রেখে দিতে পারেন NaN:

In [87]:

nms
Out[87]:
  movie    name  rating
0   thg    John       3
1   thg     NaN       4
3   mol  Graham     NaN
4   lob     NaN     NaN
5   lob     NaN     NaN

[5 rows x 3 columns]
In [89]:

nms = nms.dropna(thresh=2)
In [90]:

nms[nms.name.notnull()]
Out[90]:
  movie    name  rating
0   thg    John       3
3   mol  Graham     NaN

[2 rows x 3 columns]

সম্পাদনা

প্রকৃতপক্ষে আপনি মূলত যা চান তা দেখে dropnaকল ছাড়াই আপনি এটি করতে পারেন :

nms[nms.name.notnull()]

হালনাগাদ

এই প্রশ্নটি 3 বছর পরে দেখার পরে, একটি ভুল আছে, প্রথমে threshযুক্তিটি কমপক্ষে nঅ- NaNমানগুলির সন্ধান করে তাই বাস্তবে আউটপুটটি হওয়া উচিত:

In [4]:
nms.dropna(thresh=2)

Out[4]:
  movie    name  rating
0   thg    John     3.0
1   thg     NaN     4.0
3   mol  Graham     NaN

এটি সম্ভবত 3 বছর আগে আমার ভুল হয়েছে বা আমি যে পান্ডসের সংস্করণটি চালাচ্ছিলাম তাতে একটি বাগ ছিল, উভয় দৃশ্যই সম্পূর্ণ সম্ভব।


191

সকল সমাধানগুলির মধ্যে সহজতম:

filtered_df = df[df['name'].notnull()]

সুতরাং, এটি কেবলমাত্র সারিগুলিকে ফিল্টার করে যেগুলির 'নাম' কলামে NaN মান নেই।

একাধিক কলামের জন্য:

filtered_df = df[df[['name', 'country', 'region']].notnull().all(1)]

2
একাধিক কলামের মাধ্যমে কীভাবে এটি অর্জন করবেন, সেগুলি একসাথে করেই করুন। 'নাম' নাল বা 'ফু' শূন্য
গ্রেগ হিলস্টন

3
@ গ্রেগ হিলস্টন & বা | ব্যবহার করুন ফিল্টার করার সময় চেইন শর্তে opearator। filtered_df = df[df['name'].notnull() | df['foo'].notnull()]
দীপক রাজেন্দ্রন

2
@ গ্রেগহিলস্টন আমি আপনার প্রশ্নের উত্তরও যুক্ত করেছি, উদাহরণস্বরূপ আমি কলসের অ শূন্য মানগুলি ফিল্টার করছি = ['নাম', 'অঞ্চল', 'দেশ']
গিল বাগজিও

9
df = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'],'rating': [3., 4., 5., np.nan, np.nan, np.nan],'name': ['John','James', np.nan, np.nan, np.nan,np.nan]})

for col in df.columns:
    df = df[~pd.isnull(df[col])]

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