স্পষ্টভাবে কলাম তালিকাভুক্ত না করে প্যান্ডাস ডেটাফ্রেম থেকে এক বা একাধিক নাল দিয়ে সারিগুলি কীভাবে নির্বাচন করবেন?


232

আমার কাছে K 300K সারি এবং ~ 40 কলাম সহ একটি ডেটাফ্রেম রয়েছে। আমি কোনও সারিগুলিতে নাল মান রয়েছে কিনা তা জানতে চাই - এবং এই 'নাল'-সারিগুলিকে একটি পৃথক ডেটাফ্রেমে রেখেছি যাতে আমি সেগুলি সহজেই অন্বেষণ করতে পারি।

আমি স্পষ্টভাবে একটি মুখোশ তৈরি করতে পারি:

mask = False
for col in df.columns: 
    mask = mask | df[col].isnull()
dfnulls = df[mask]

বা আমি এর মতো কিছু করতে পারি:

df.ix[df.index[(df.T == np.nan).sum() > 1]]

এটি করার আরও কি আরও সুন্দর উপায় আছে (সেগুলির মধ্যে নাল দিয়ে সারিগুলি সনাক্ত করা)?

উত্তর:


383

[আধুনিক হিসাবে মানিয়ে নিতে আপডেট হয়েছে pandas, যা এর isnullপদ্ধতি হিসাবে রয়েছে DataFrame..]

আপনি ব্যবহার করতে পারেন isnullএবং anyবুলিয়ান সিরিজ তৈরি করতে এবং এটি আপনার ফ্রেমে সূচীতে ব্যবহার করতে পারেন:

>>> df = pd.DataFrame([range(3), [0, np.NaN, 0], [0, 0, np.NaN], range(3), range(3)])
>>> df.isnull()
       0      1      2
0  False  False  False
1  False   True  False
2  False  False   True
3  False  False  False
4  False  False  False
>>> df.isnull().any(axis=1)
0    False
1     True
2     True
3    False
4    False
dtype: bool
>>> df[df.isnull().any(axis=1)]
   0   1   2
1  0 NaN   0
2  0   0 NaN

[বয়স্কদের জন্য pandas:]

আপনি isnullপদ্ধতির পরিবর্তে ফাংশনটি ব্যবহার করতে পারেন :

In [56]: df = pd.DataFrame([range(3), [0, np.NaN, 0], [0, 0, np.NaN], range(3), range(3)])

In [57]: df
Out[57]: 
   0   1   2
0  0   1   2
1  0 NaN   0
2  0   0 NaN
3  0   1   2
4  0   1   2

In [58]: pd.isnull(df)
Out[58]: 
       0      1      2
0  False  False  False
1  False   True  False
2  False  False   True
3  False  False  False
4  False  False  False

In [59]: pd.isnull(df).any(axis=1)
Out[59]: 
0    False
1     True
2     True
3    False
4    False

বরং কমপ্যাক্টের দিকে পরিচালিত:

In [60]: df[pd.isnull(df).any(axis=1)]
Out[60]: 
   0   1   2
1  0 NaN   0
2  0   0 NaN

75
def nans(df): return df[df.isnull().any(axis=1)]

তারপরে যখন আপনার প্রয়োজন হয় আপনি টাইপ করতে পারেন:

nans(your_dataframe)

1
df[df.isnull().any(axis=1)]কাজ কিন্তু ছোঁড়ার UserWarning: Boolean Series key will be reindexed to match DataFrame index.। কীভাবে একজন আরও স্পষ্টভাবে এবং এমন এক উপায়ে পুনর্লিখন করে যাতে এই সতর্কতা বার্তাটি ট্রিগার করে না?
বিশাল

3
@ বিশাল আমার মনে হয় আপনার যা করার দরকার তা হ'ল এই জাতীয় লোক যুক্ত করা; df.loc[df.isnull().any(axis=1)]
জেমস ড্রপার


0

.any()এবং .all()চরম ক্ষেত্রে ক্ষেত্রে দুর্দান্ত তবে আপনি যখন একটি নির্দিষ্ট সংখ্যক নাল মান খুঁজছেন তখন তা নয়। আপনি যা জিজ্ঞাসা করছেন তা আমি বিশ্বাস করি এমন করার একটি অত্যন্ত সহজ উপায়। এটি বেশ ভার্জোজ, তবে কার্যকরী।

import pandas as pd
import numpy as np

# Some test data frame
df = pd.DataFrame({'num_legs':          [2, 4,      np.nan, 0, np.nan],
                   'num_wings':         [2, 0,      np.nan, 0, 9],
                   'num_specimen_seen': [10, np.nan, 1,     8, np.nan]})

# Helper : Gets NaNs for some row
def row_nan_sums(df):
    sums = []
    for row in df.values:
        sum = 0
        for el in row:
            if el != el: # np.nan is never equal to itself. This is "hacky", but complete.
                sum+=1
        sums.append(sum)
    return sums

# Returns a list of indices for rows with k+ NaNs
def query_k_plus_sums(df, k):
    sums = row_nan_sums(df)
    indices = []
    i = 0
    for sum in sums:
        if (sum >= k):
            indices.append(i)
        i += 1
    return indices

# test
print(df)
print(query_k_plus_sums(df, 2))

আউটপুট

   num_legs  num_wings  num_specimen_seen
0       2.0        2.0               10.0
1       4.0        0.0                NaN
2       NaN        NaN                1.0
3       0.0        0.0                8.0
4       NaN        9.0                NaN
[2, 4]

তারপরে, আপনি যদি আমার মতো হন এবং এই সারিগুলি সরিয়ে দিতে চান তবে আপনি কেবল এটি লিখুন:

# drop the rows from the data frame
df.drop(query_k_plus_sums(df, 2),inplace=True)
# Reshuffle up data (if you don't do this, the indices won't reset)
df = df.sample(frac=1).reset_index(drop=True)
# print data frame
print(df)

আউটপুট:

   num_legs  num_wings  num_specimen_seen
0       4.0        0.0                NaN
1       0.0        0.0                8.0
2       2.0        2.0               10.0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.