2013-01-09 34 views
94

मेरे पास ~ 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]] 

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

उत्तर

174

[आधुनिक pandas, जो DataFrame रों की विधि के रूप isnull है के लिए अनुकूल करने के लिए अपडेट किया गया ..]

आप 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 के लिए:]

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 

बल्कि कॉम्पैक्ट को प्रेरित किया:: आप विधि के बजाय समारोह isnull इस्तेमाल कर सकते हैं

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

तो जब कभी आपको ज़रूरत है लिख सकते हैं:

nans(your_dataframe)