2015-11-10 21 views
5

में NaN मानों के सूचकांक पुनर्प्राप्त करें मैं संबंधित पंक्तियों के सभी सूचकांक NaN मान वाली प्रत्येक पंक्ति के लिए पुनर्प्राप्त करने का प्रयास करता हूं।एक पांडा डेटाफ्रेम

d=[[11.4,1.3,2.0, NaN],[11.4,1.3,NaN, NaN],[11.4,1.3,2.8, 0.7],[NaN,NaN,2.8, 0.7]] 
df = pd.DataFrame(data=d, columns=['A','B','C','D']) 
print df 

     A B C D 
0 11.4 1.3 2.0 NaN 
1 11.4 1.3 NaN NaN 
2 11.4 1.3 2.8 0.7 
3 NaN NaN 2.8 0.7 

मैं पहले से ही किया है निम्नलिखित:

  • प्रत्येक पंक्ति
  • के लिए NaN की गिनती के साथ एक कॉलम जोड़ NaN युक्त प्रत्येक पंक्ति के सूचकांक प्राप्त महत्व देता

मैं जो चाहता हूं (आदर्श रूप से कॉलम का नाम) इस तरह की एक सूची प्राप्त करता है:

[ ['D'],['C','D'],['A','B'] ] 

आशा मैं प्रत्येक स्तंभ

if df.ix[i][column] == NaN: 

मैं एक पांडा तरह से मेरी बड़ी डाटासेट से निपटने के लिए सक्षम होने के लिए की तलाश में हूँ के लिए प्रत्येक पंक्ति के लिए परीक्षण कर के बिना एक तरह से पा सकते हैं।

अग्रिम धन्यवाद।

+0

मुझे पहले से ही प्रत्येक पंक्ति के सूचकांक मिले हैं जिनमें NaN v alues। मैं जो चाहता हूं वह प्रत्येक पंक्ति के लिए कॉलम के सूचकांक है। क्षमा करें अगर विवरण अस्पष्ट था। – dooms

उत्तर

2

एक और तरीका है, पंक्तियों जो NaN हैं निकालें:

In [11]: df_null = df.isnull().unstack() 

In [12]: t = df_null[df_null] 

In [13]: t 
Out[13]: 
A 3 True 
B 3 True 
C 1 True 
D 0 True 
    1 True 
dtype: bool 

यह आपको रास्ते का सबसे हो जाता है और पर्याप्त हो सकता है।
यह श्रृंखला के साथ काम करने के लिए आसान हो सकता है:

In [14]: s = pd.Series(t2.index.get_level_values(1), t2.index.get_level_values(0)) 

In [15]: s 
Out[15]: 
0 D 
1 C 
1 D 
3 A 
3 B 
dtype: object 

उदा यदि आप सूचियों (हालांकि मुझे नहीं लगता कि आप उन्हें जरूरत होगी) चाहता था

In [16]: s.groupby(level=0).apply(list) 
Out[16]: 
0  [D] 
1 [C, D] 
3 [A, B] 
dtype: object 
+0

यह स्पष्ट रूप से सबसे अधिक "पांडुलिपी" तरीका है लेकिन @maxymoo – dooms

+0

@Dooms से 100 गुना धीमा है क्या आप का मतलब है? –

+0

@ बड़े डेटासेट पर डूम्स पहले कुछ बहुत तेज होना चाहिए .. –

3

यह एक scipy उपयोग करने के लिए समन्वय प्रारूप विरल मैट्रिक्स शून्य मान के निर्देशांक को पुनः प्राप्त करने कुशल होना चाहिए:

import scipy.sparse as sp 

x,y = sp.coo_matrix(df.isnull()).nonzero() 
print(list(zip(x,y))) 

[(0, 3), (1, 2), (1, 3), (3, 0), (3, 1)] 

ध्यान दें कि मैं सिर्फ उत्पादन करने के क्रम में nonzero विधि फोन कर रहा हूँ के निर्देशांक अंतर्निहित स्पैर मैट्रिक्स में nonzero प्रविष्टियां क्योंकि मुझे वास्तविक मानों की परवाह नहीं है जो सभी True हैं।

+0

यह समाधान 2 गुना तेज है (@ अलेक्जेंडर की तुलना में) लेकिन मुझे नहीं पता कि इस तरह के डेटा में नेविगेट कैसे करें। यह एक सूची – dooms

+0

भयानक समाधान के रूप में आसान नहीं है, धन्यवाद! –

1

आप डेटाफ्रेम में प्रत्येक पंक्ति के माध्यम से पुन: सक्रिय कर सकते हैं, शून्य मानों का मुखौटा बना सकते हैं, और उनके सूचकांक (यानी डेटाफ्रेम में कॉलम) आउटपुट कर सकते हैं।

lst = [] 
for _, row in df.iterrows(): 
    mask = row.isnull() 
    lst += [row[mask].index.tolist()] 

>>> lst 
[['D'], ['C', 'D'], [], ['A', 'B']] 
0

एक और आसान तरीका है:

>>>df.isnull().any(axis=1) 
0  True 
1  True 
2 False 
3  True 
dtype: bool 

सबसेट तक:

>>> bool_idx = df.isnull().any(axis=1) 
>>> df[bool_idx] 
    A   B  C D 
0 11.4 1.3  2.0 NaN 
1 11.4 1.3  NaN NaN 
3 NaN  NaN 2.8 0.7 

पूर्णांक सूचकांक पाने के लिए :

>>> df[bool_idx].index 
Int64Index([0, 1, 3], dtype='int64') 
संबंधित मुद्दे