2015-03-28 25 views
19

मेरे पास एक पीडी.डेटाफ्रेम है जो कुछ उत्कृष्ट स्प्रेडशीट को पार्स करके बनाया गया था। एक स्तंभ जिसमें खाली कोशिकाएं हैं। उदाहरण के लिए, नीचे उस कॉलम की आवृत्ति के लिए आउटपुट है, 32320 रिकॉर्ड्स में किरायेदार के लिए मूल्य गुम हैं।पायथन पांडस डेटाफ्रेम खाली कोशिकाओं को हटाएं

In [67]: value_counts(Tenant,normalize=False) 
    Out[67]: 
           32320 
    Thunderhead    8170 
    Big Data Others   5700 
    Cloud Cruiser    5700 
    Partnerpedia    5700 
    Comcast     5700 
    SDP      5700 
    Agora      5700 
    dtype: int64 

मैं पंक्तियों जहां किरायेदार याद आ रही है, फिर भी isnull विकल्प लापता मूल्यों को नहीं पहचानता है ड्रॉप करने की कोशिश कर रहा हूँ।

In [71]: df['Tenant'].isnull().sum() 
    Out[71]: 0 

कॉलम में डेटा प्रकार "ऑब्जेक्ट" है। इस मामले में क्या हो रहा है? मैं रिकॉर्ड कैसे छोड़ सकता हूं जहां किरायेदार गायब है?

उत्तर

40

पांडस np.nan ऑब्जेक्ट है, तो यह मान को शून्य के रूप में पहचान देगा, जो डेटाफ्रेम में NaN के रूप में प्रिंट करेगा। आपके लापता मूल्य शायद खाली तार हैं, जो पांडस शून्य के रूप में नहीं पहचानते हैं। इसे सुधारने के लिए, आप np.nan ऑब्जेक्ट्स को का उपयोग करके रिक्त डंक (या जो भी खाली रिक्त कक्ष में हैं) को कन्वर्ट कर सकते हैं, और फिर अपने डेटाफ्रेम पर dropna() को नल किरायेदारों के साथ पंक्तियों को हटाने के लिए कॉल करें।

प्रदर्शित करने के लिए, मैं एक Tenants स्तंभ में कुछ यादृच्छिक मूल्यों और कुछ रिक्त स्ट्रिंग के साथ एक DataFrame बनाएँ:

>>> import pandas as pd 
>>> import numpy as np 
>>> 
>>> df = pd.DataFrame(np.random.randn(10, 2), columns=list('AB')) 
>>> df['Tenant'] = np.random.choice(['Babar', 'Rataxes', ''], 10) 
>>> print df 

      A   B Tenant 
0 -0.588412 -1.179306 Babar 
1 -0.008562 0.725239   
2 0.282146 0.421721 Rataxes 
3 0.627611 -0.661126 Babar 
4 0.805304 -0.834214   
5 -0.514568 1.890647 Babar 
6 -1.188436 0.294792 Rataxes 
7 1.471766 -0.267807 Babar 
8 -1.730745 1.358165 Rataxes 
9 0.066946 0.375640   

अब मैं Tenants स्तंभ में किसी भी रिक्त स्ट्रिंग np.nan वस्तुओं के साथ है, तो तरह बदल देते हैं:

>>> df['Tenant'].replace('', np.nan, inplace=True) 
>>> print df 

      A   B Tenant 
0 -0.588412 -1.179306 Babar 
1 -0.008562 0.725239  NaN 
2 0.282146 0.421721 Rataxes 
3 0.627611 -0.661126 Babar 
4 0.805304 -0.834214  NaN 
5 -0.514568 1.890647 Babar 
6 -1.188436 0.294792 Rataxes 
7 1.471766 -0.267807 Babar 
8 -1.730745 1.358165 Rataxes 
9 0.066946 0.375640  NaN 

अब मैं ड्रॉप कर सकते हैं शून्य मान:

>>> df.dropna(subset=['Tenant'], inplace=True) 
>>> print df 

      A   B Tenant 
0 -0.588412 -1.179306 Babar 
2 0.282146 0.421721 Rataxes 
3 0.627611 -0.661126 Babar 
5 -0.514568 1.890647 Babar 
6 -1.188436 0.294792 Rataxes 
7 1.471766 -0.267807 Babar 
8 -1.730745 1.358165 Rataxes 
+0

धन्यवाद एक बहुत मैं इस प्रयास करें और वापस मिल जाएगा! –

+1

@ एमसीएमथ, थोड़ा उत्सुक। जब आप 'pd.np.nan' कर सकते हैं तो आप numpy क्यों आयात करते हैं और 'np.nan' का उपयोग करते हैं? – propjk007

+2

@ propjk007, जीवन में कई चीजों के साथ, कई चीजें करने के कई तरीके हैं – andrew

15

value_counts डिफ़ॉल्ट रूप से NaN को छोड़ देता है ताकि आप सबसे अधिक संभावना से निपट रहे हों।

तो आप बस उन्हें बाहर की तरह

filter = df["Tenant"] != "" 
dfNew = df[filter] 
+0

बहुत बहुत धन्यवाद! –

+0

@ बॉब्स समाधान मेरे लिए काम नहीं किया। df.dropna (subset = ['किरायेदार'], inplace = True) काम करता है। –

+1

इसके बारे में क्षमा करें। मैंने सोचा था कि आप "" से निपट रहे थे। आपको अपना समाधान उत्तर के रूप में पोस्ट करना चाहिए –

1

फ़िल्टर कर सकते हैं आप इस बदलाव का उपयोग कर सकते हैं:

import pandas as pd 
vals = { 
    'name' : ['n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7'], 
    'gender' : ['m', 'f', 'f', 'f', 'f', 'c', 'c'], 
    'age' : [39, 12, 27, 13, 36, 29, 10], 
    'education' : ['ma', None, 'school', None, 'ba', None, None] 
} 
df_vals = pd.DataFrame(vals) #converting dict to dataframe 

हो जाएगा ताकि निर्गम (** - केवल इच्छित पंक्तियों पर प्रकाश डाला):

age education gender name 
0 39  ma  m n1 ** 
1 12  None  f n2  
2 27 school  f n3 ** 
3 13  None  f n4 
4 36  ba  f n5 ** 
5 29  None  c n6 
6 10  None  c n7 

तो सब कुछ छोड़ने के लिए जिसमें 'शिक्षा' मूल्य नहीं है, नीचे दिए गए कोड का उपयोग करें:

df_vals = df_vals[~df_vals['education'].isnull()] 

('~' नहीं यह दर्शाता है)

परिणाम:

age education gender name 
0 39  ma  m n1 
2 27 school  f n3 
4 36  ba  f n5 
संबंधित मुद्दे