পান্ডাস ডেটা ফ্রেমে NaN এর সাথে সারিগুলির পূর্ণসংখ্য সূচকটি সন্ধান করুন


96

আমার কাছে এই রকম একটি পান্ডাস ডেটা ফ্রেম রয়েছে:

                    a         b
2011-01-01 00:00:00 1.883381  -0.416629
2011-01-01 01:00:00 0.149948  -1.782170
2011-01-01 02:00:00 -0.407604 0.314168
2011-01-01 03:00:00 1.452354  NaN
2011-01-01 04:00:00 -1.224869 -0.947457
2011-01-01 05:00:00 0.498326  0.070416
2011-01-01 06:00:00 0.401665  NaN
2011-01-01 07:00:00 -0.019766 0.533641
2011-01-01 08:00:00 -1.101303 -1.408561
2011-01-01 09:00:00 1.671795  -0.764629

NaN এর সাথে সারিগুলির "পূর্ণসংখ্যার" সূচকটি খুঁজে পাওয়ার কোনও কার্যকর উপায় আছে কি? এই ক্ষেত্রে কাঙ্ক্ষিত আউটপুট হওয়া উচিত [3, 6]


12
আপনি যদি শুধু ন্যান দিয়ে সারিগুলি নির্বাচন করতে চান তবে আপনি এটি করতে পারেনdf[np.isnan(df['b'])]
lazy1

4
@ Lazy1 থেকে অনুসরণ - পরিবর্তে ব্যবহার করার numpy's isnanআপনার কাছে ব্যবহার করতে পারেনdf['b'].isnull()
jmetz

উত্তর:


48

ডেটা ফ্রেমের জন্য df:

import numpy as np
index = df['b'].index[df['b'].apply(np.isnan)]

আপনি MultiIndexযে সূচকটি আবার ব্যবহার করতে পারবেন তা ফিরিয়ে দেবে df, যেমন:

df['a'].ix[index[0]]
>>> 1.452354

পূর্ণসংখ্যা সূচকের জন্য:

df_index = df.index.values.tolist()
[df_index.index(i) for i in index]
>>> [3, 6]

4
যেমন স্বজ্ঞাত হিসাবে ixশব্দ, কিছু কারণ জন্য শোনাচ্ছে মত হয়েছে অবচিত পক্ষেiloc
এলাচ

145

এখানে একটি সহজ সমাধান:

inds = pd.isnull(df).any(1).nonzero()[0]

In [9]: df
Out[9]: 
          0         1
0  0.450319  0.062595
1 -0.673058  0.156073
2 -0.871179 -0.118575
3  0.594188       NaN
4 -1.017903 -0.484744
5  0.860375  0.239265
6 -0.640070       NaN
7 -0.535802  1.632932
8  0.876523 -0.153634
9 -0.686914  0.131185

In [10]: pd.isnull(df).any(1).nonzero()[0]
Out[10]: array([3, 6])

29
আমি এটি ব্যবহার করে শেষ করেছি:np.where(df['b'].notnull())[0]

ধন্যবাদ, এর .nonzero()[0]চেয়েও ভাল [i for i, k in enumerate(mask) if k]))
উইনানড

4
আপনি সম্ভবত এটি আরও সরল করতে পারেন:r, _ = np.where(df.isna())
সিএস 95

4
.to_numpy()প্রথমে নপি অ্যারে রূপান্তর করতে যুক্ত করুন -pd.isnull(df).any(1).to_numpy().nonzero()
বিস্ট্যান

14

এক লাইন সমাধান। তবে এটি কেবল একটি কলামের জন্য কাজ করে।

df.loc[pandas.isna(df["b"]), :].index

এই আমি খুঁজছিলাম ছিল। আমি একে একে list(...)ঠিক তেমনভাবে মুড়িয়ে এটি একটি তালিকাতে তৈরি করেছি :list(df.loc[pandas.isna(df["b"]), :].index)
ড্যানিয়েল বাটলার 17

10

এবং কেবলমাত্র যদি আপনি তার পরিবর্তে সমস্ত কলামের জন্য 'নান' এর স্থানাঙ্কগুলি সন্ধান করতে চান (ধরুন তারা সমস্ত সংখ্যাসূচক) তবে আপনি এখানে যান:

df = pd.DataFrame([[0,1,3,4,np.nan,2],[3,5,6,np.nan,3,3]])

df
   0  1  2    3    4  5
0  0  1  3  4.0  NaN  2
1  3  5  6  NaN  3.0  3

np.where(np.asanyarray(np.isnan(df)))
(array([0, 1]), array([4, 3]))

9

এটি বেশি দেরী হয়েছে কিনা তা জানেন না তবে আপনি অ-মান ব্যবহার করে সূচকগুলি খুঁজে পেতে এনপি.ওহোয়ার ব্যবহার করতে পারেন:

indices = list(np.where(df['b'].isna()[0]))

4

সেক্ষেত্রে আপনার ডেটটাইম সূচক রয়েছে এবং আপনি মানগুলি রাখতে চান:

df.loc[pd.isnull(df).any(1), :].index.values

4

কয়েকটি পদ্ধতির জন্য এখানে পরীক্ষা দেওয়া হচ্ছে:

%timeit np.where(np.isnan(df['b']))[0]
%timeit pd.isnull(df['b']).nonzero()[0]
%timeit np.where(df['b'].isna())[0]
%timeit df.loc[pd.isna(df['b']), :].index

এবং তাদের সম্পর্কিত সময়:

333 µs ± 9.95 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
280 µs ± 220 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
313 µs ± 128 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
6.84 ms ± 1.59 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

pd.isnull(df['DRGWeight']).nonzero()[0]সময় উপস্থিতি অনুসারে দিনটি জিততে পারে তা দেখা যাবে , তবে শীর্ষ তিনটি পদ্ধতির যে কোনওটির তুলনীয় পারফরম্যান্স রয়েছে।



1

এখানে আরও একটি সহজ গ্রহণ করা হল:

df = pd.DataFrame([[0,1,3,4,np.nan,2],[3,5,6,np.nan,3,3]])

inds = np.asarray(df.isnull()).nonzero()

(array([0, 1], dtype=int64), array([4, 3], dtype=int64))

1

আমি NaN মান সহ সারিগুলির সমস্ত সূচী সন্ধান করছিলাম।
আমার কাজের সমাধান:

def get_nan_indexes(data_frame):
    indexes = []
    print(data_frame)
    for column in data_frame:
        index = data_frame[column].index[data_frame[column].apply(np.isnan)]
        if len(index):
            indexes.append(index[0])
    df_index = data_frame.index.values.tolist()
    return [df_index.index(i) for i in set(indexes)]

0

Dataframe নামে হোক df প্রয়োগ এবং সুদের কলাম (অর্থাত কলাম যা আমরা NULLs খোঁজার চেষ্টা করছেন ) হল 'খ' । তারপরে নিম্নলিখিত স্নিপেটটি ডেটাফ্রেমে নালার পছন্দসই সূচকটি দেয়:

   for i in range(df.shape[0]):
       if df['b'].isnull().iloc[i]:
           print(i)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.