2015-03-28 52 views
19

Ho un pd.DataFrame che è stato creato analizzando alcuni fogli di calcolo Excel. Una colonna di cui ha celle vuote. Ad esempio, di seguito è riportato l'output per la frequenza di quella colonna, i record 32320 hanno valori mancanti per Tenant.Python Pandora DataFrame rimuove le celle vuote

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 

Sto tentando di eliminare le righe in cui manca Tenant, tuttavia l'opzione nullo non riconosce i valori mancanti.

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

La colonna ha il tipo di dati "Oggetto". Cosa sta succedendo in questo caso? Come posso eliminare i record in cui manca Tenant?

risposta

40

Pandas riconoscerà un valore come null se si tratta di un oggetto np.nan, che verrà stampato come NaN in DataFrame. I tuoi valori mancanti sono probabilmente stringhe vuote, che Pandas non riconosce come null. Per correggere ciò, è possibile convertire le punture vuote (o qualsiasi cosa nelle celle vuote) negli oggetti np.nan utilizzando replace() e quindi chiamare dropna() sul DataFrame per eliminare le righe con tenant nulli.

Per dimostrare, creo un dataframe con alcuni valori casuali e alcune stringhe vuote in una colonna Tenants:

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

Ora mi sostituisce eventuali stringhe vuote nella colonna Tenants con np.nan oggetti, in questo modo:

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

Ora posso rilasciare i valori nulli:

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

Grazie mille farò dare una prova e tornare! –

+1

@mcmath, un po 'curioso. Perché importate numpy e usate 'np.nan' quando potete fare' pd.np.nan'? – propjk007

+2

@ propjk007, come con molte cose nella vita, ci sono molti modi per fare molte cose – andrew

15

value_counts omette NaN per impostazione predefinita, quindi è probabile che si tratti di "".

Così si può semplicemente filtrare come

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

grazie mille! –

+0

La soluzione di @Bobs non ha funzionato per me. df.dropna (subset = ['tenant'], inplace = True) funziona. –

+1

Mi dispiace per quello. Pensavo avessi a che fare con "" s. Dovresti pubblicare la tua soluzione come risposta –

1

È possibile utilizzare questa variante:

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 

Questa uscita volontà (** - mettendo in evidenza solo le righe desiderati):

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 

Quindi, per eliminare tutto ciò che non ha un valore 'educazione', utilizzare il codice seguente:

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

('~' che indica NOT)

Risultato:

age education gender name 
0 39  ma  m n1 
2 27 school  f n3 
4 36  ba  f n5 
Problemi correlati