2012-12-24 6 views
53

मैं इस तरह एक पांडा DataFrame है:अजगर - पांडा में NaN वाली पंक्तियों की पूर्णांक सूचकांक को खोजने

    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 

वहाँ Nans वाली पंक्तियों की "पूर्णांक" अनुक्रमणिका को खोजने के लिए एक कारगर तरीका है? इस मामले में वांछित आउटपुट [3, 6] होना चाहिए।

+9

यदि आप सिर्फ नैन के साथ पंक्तियों का चयन करना चाहते हैं, तो आप 'df [np.isnan (df ['b'])]' – lazy1

+4

कर सकते हैं @ lazy1 से ऊपर - 'numpy' 'isnan' का उपयोग करने के बजाय 'df ['b'] का उपयोग भी कर सकते हैं। isnull()' – jmetz

उत्तर

25

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

यहां एक आसान समाधान है:

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]) 
+19

मैंने इसका उपयोग समाप्त कर दिया: 'np.where (df ['b']। notnull()) [0]' – ezbentley

+0

धन्यवाद, '.no nzero() [0] '' से बेहतर है [i के लिए मैं, k में enumerate (मास्क) अगर k] ') – Winand

1

और बस के मामले में, यदि आप सभी स्तंभों के लिए बजाय 'नेन' के निर्देशांक लगाना चाहते हैं (मान वे तो प्रश्न कर रहे हैं), ये रहा:

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