एक पांडा से खाली कोशिकाओं वाली पंक्तियाँ छोड़ें DataFrame


87

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

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

मैं उन पंक्तियों को छोड़ने की कोशिश कर रहा हूं जहां किरायेदार गायब है, हालांकि .isnull()विकल्प लापता मूल्यों को नहीं पहचानता है।

>>> df['Tenant'].isnull().sum()
    0

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

जवाबों:


174

पांड एक मान को शून्य के रूप में पहचानेंगे यदि यह एक np.nanवस्तु है, जो NaNडेटाफ़्रेम में प्रिंट होगा । आपके लापता मान शायद खाली तार हैं, जिन्हें पंडाल अशक्त के रूप में नहीं पहचानता है। इसे ठीक करने के लिए, आप खाली डंक (या जो कुछ भी आपकी खाली कोशिकाओं में है) को np.nanउपयोग करने वाली वस्तुओं में बदल सकते हैं replace(), और फिर 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

बहुत बहुत धन्यवाद मैं इसे एक कोशिश करूँगा और वापस मिलूंगा!
अमृता सावंत

2
@ मिकमठ, थोड़ा जिज्ञासु। np.nanजब आप कर सकते हैं तो आप सुन्न और आयात क्यों करते हैं pd.np.nan?
Propjk007

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

मेरे परीक्षणों से , ऐसा लगता है df[df['Tenant'].astype(bool)]कि (कोई df.replace('', np.nan).dropna(subset=['Tenant'])
व्हॉट्सएप चार्ट

42

पाइथोनिक + पांडेय: df[df['col'].astype(bool)]

खाली तार झूठा है, जिसका अर्थ है कि आप इस तरह से मल मूल्यों पर फ़िल्टर कर सकते हैं:

df = pd.DataFrame({
    'A': range(5),
    'B': ['foo', '', 'bar', '', 'xyz']
})
df
   A    B
0  0  foo
1  1     
2  2  bar
3  3     
4  4  xyz
df['B'].astype(bool)                                                                                                                      
0     True
1    False
2     True
3    False
4     True
Name: B, dtype: bool

df[df['B'].astype(bool)]                                                                                                                  
   A    B
0  0  foo
2  2  bar
4  4  xyz

यदि आपका लक्ष्य न केवल खाली तारों को निकालना है, बल्कि केवल व्हाट्सएप वाले तार भी हैं, तो str.stripपहले से उपयोग करें :

df[df['B'].str.strip().astype(bool)]
   A    B
0  0  foo
2  2  bar
4  4  xyz

जितना आप सोचते हैं उससे भी तेज

.astypeएक सदिश ऑपरेशन है, यह इस प्रकार प्रस्तुत किए गए हर विकल्प की तुलना में तेज़ है। कम से कम, मेरे परीक्षणों से। YMMV।

यहाँ एक समय की तुलना है, मैंने कुछ अन्य तरीकों में फेंक दिया है जिनके बारे में मैं सोच सकता था।

यहां छवि विवरण दर्ज करें

संदर्भ के लिए बेंचमार्किंग कोड:

import pandas as pd
import perfplot

df1 = pd.DataFrame({
    'A': range(5),
    'B': ['foo', '', 'bar', '', 'xyz']
})

perfplot.show(
    setup=lambda n: pd.concat([df1] * n, ignore_index=True),
    kernels=[
        lambda df: df[df['B'].astype(bool)],
        lambda df: df[df['B'] != ''],
        lambda df: df[df['B'].replace('', np.nan).notna()],  # optimized 1-col
        lambda df: df.replace({'B': {'': np.nan}}).dropna(subset=['B']),  
    ],
    labels=['astype', "!= ''", "replace + notna", "replace + dropna", ],
    n_range=[2**k for k in range(1, 15)],
    xlabel='N',
    logx=True,
    logy=True,
    equality_check=pd.DataFrame.equals)

33

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

तो आप बस उन्हें बाहर की तरह फ़िल्टर कर सकते हैं

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

1
@ बॉब्स सॉल्यूशन मेरे काम नहीं आया। df.dropna (सबसेट = ['टेनेंट'], inplace = True) काम करता है।
अमृता सावंत

1
उसके लिए माफ़ करना। मुझे लगा कि आप "" के साथ काम कर रहे हैं। आपको अपना समाधान एक उत्तर के रूप में पोस्ट करना चाहिए
बॉब हाफनर

8

ऐसी स्थिति है जहां सेल में सफेद स्थान है, आप इसे देख नहीं सकते, उपयोग कर सकते हैं

df['col'].replace('  ', np.nan, inplace=True)

फिर NaN के रूप में सफेद स्थान को बदलने के लिए

df= df.dropna(subset=['col'])

4

आप इस विविधता का उपयोग कर सकते हैं:

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