2016-02-03 14 views
5

Sono stato a questa mattina per tutto e ho lentamente messo insieme le cose. Ma per la vita di me non riesco a capire come usare la funzione .str.startswith() in Panda.Come eliminare le righe che non iniziano con 'x' in Panda o mantenere le righe che iniziano con 'x'

mio XLSX fogli di calcolo è il seguente

1 Name, Registration Date, Phone number 
2 John Doe, 2015-11-20T19:54:45Z, 1.1112223333 
3 Jane Doe, 2015-11-20T20:44:26Z, 65.1112223333 
etc... 

Così sto importarlo come un frame di dati, la pulizia l'intestazione in modo che non ci sono spazi e simili, allora voglio eliminare tutte le righe che non iniziano con ' 1.' (o mantenere le righe che iniziano con '1') e cancellare tutti gli altri. Quindi, in questo breve esempio, elimina l'intera voce "Jane Doe" poiché il suo numero di telefono inizia con "65".

import pandas as pd 
df = pd.read_excel('testingpanda.xlsx', sheetname = 'Export 1') 
def colHeaderCleaner(): 
    cols = df.columns 
    cols = cols.map(lambda x: x.replace(' ', '_') if isinstance(x, (str, unicode)) else x) 
    df.columns = cols 
    df.columns = [x.lower() for x in df.columns] 

colHeaderCleaner() 

#by default it sets the values in 'registrant_phone' as float64, so this is fixing that... 
df['registrant_phone'] = df['registrant_phone'].astype('object') 

Il più vicino che ho ottenuto, e con questo intendo l'unica linea sono stato in grado di eseguire senza traceback fastidiosi e altri errori è:

df['registrant_phone'] = df['registrant_phone'].str.startswith('1') 

Ma tutto ciò che fa è di convertire tutto il telefono i valori per 'NaN', mantiene tutte le righe e tutto come illustrato di seguito:

print df 
[output] name, registration_date, phone_number 
[output] John Doe, 2015-11-20T19:54:45Z, NaN 
[output] Jane Doe, 2015-11-20T20:44:26Z, NaN 

ho cercato troppi posti da provare, anche alla lista, ho provato diverse versioni di df.drop e proprio non riesco a capire niente. Dove vado da qui?

+0

si desidera 'df = df .loc [df ['registrant_phone']. str.startswith ('1')] ' – EdChum

risposta

8

Sono un po 'confuso dalla tua domanda. In ogni caso, se si dispone di un dataframe df con una colonna 'c', e si desidera rimuovere gli elementi che iniziano con 1, quindi il modo più sicuro sarebbe quello di usare qualcosa come:

df = df[~df['c'].astype(str).str.startswith('1')] 
+0

Ha funzionato. Beh ... con alcune modifiche, alla fine ci voleva un 's' per farlo 'startswith' e si capovolgeva e manteneva tutto ciò che non volevo, ma ho eliminato il ~ e ha funzionato. Qual è il ~ detto? è solo un altro modo di dire "no"? Immagino che il mio vero problema fosse la parte "oggetto", da quello che stavo leggendo "oggetto" era la versione di Pandas, ma apparentemente non del tutto. Grazie per l'aiuto! – Mxracer888

+1

Sei il benvenuto. '~' è infatti la negazione in 'numpy-ish'. –

Problemi correlati