स्पष्ट रूप से स्तंभों को सूचीबद्ध किए बिना एक पांडा डेटाफ़्रेम से एक या अधिक नलियों वाली पंक्तियों का चयन कैसे करें?


233

मेरे पास ~ 300K पंक्तियों और ~ 40 कॉलमों के साथ एक डेटाफ्रेम है। मैं यह जानना चाहता हूं कि क्या किसी पंक्तियों में अशक्त मूल्य हैं - और इन 'null'-पंक्तियों को एक अलग डेटाफ़्रेम में डाल दें ताकि मैं उन्हें आसानी से देख सकूं।

मैं स्पष्ट रूप से एक मुखौटा बना सकता हूं:

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]]

वहाँ यह करने का एक और अधिक सुंदर तरीका है (उन में नल के साथ पंक्तियों का पता लगाने)?

जवाबों:


384

[आधुनिक के अनुकूल होने के लिए अद्यतन किया गया है 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.