2016-02-03 11 views
5

Byłem w tym przez cały ranek i powoli składałem razem. Ale dla mojego życia nie mogę wymyślić, jak użyć funkcji .str.startswith() w Pandach.Jak usunąć wiersze, które nie zaczynają się od "x" w Pandach, lub zachować wiersze zaczynające się od "x"

My XLSX kalkulacyjny jest następujący

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

Więc jestem importowania go jako ramki danych, czyszczenie nagłówek tak, że nie ma miejsca i takie, następnie chcę usunąć wszystkie wiersze nie zaczynające się od ' 1. " (lub zachowaj wiersze zaczynające się od "1.") i usuń wszystkie pozostałe. W tym krótkim przykładzie usuń cały wpis "Jane Doe", ponieważ jej numer telefonu zaczyna się od "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') 

Najbliżej mam zdobyć, i przez to mam na myśli tylko linia byłem w stanie wykonać bez irytujących tracebacks i innych błędów jest:

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

Ale wszystko, co robi, jest przekonwertować cały telefon wartości dla „NaN”, zachowuje wszystkie wiersze i wszystko tak jak pokazano poniżej:

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 

Przeszukałem zbyt wiele miejsca, nawet starają się liście, próbowałem różnych wersji df.drop i po prostu nie może niczego zrozumieć. Gdzie mogę się stąd udać?

+0

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

Odpowiedz

8

Jestem nieco zdezorientowany twoim pytaniem. W każdym razie, jeśli masz DataFrame df z kolumną 'c' i chcesz usunąć elementy zaczynające 1, wtedy najbezpieczniej byłoby użyć coś takiego:

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

To zadziałało. No cóż ... z kilkoma modyfikacjami, potrzebowałem "s" na końcu, aby było "startewith" i odwróciło się i zachowało wszystko, czego nie chciałem, ale wyjąłem ~ i zadziałało. Co to jest? czy to tylko inny sposób powiedzenia "nie jest"? Domyślam się, że moim prawdziwym problemem była część "obiektu", z tego, co czytałem "obiekt", była wersja str Pandasa, ale najwyraźniej niezupełnie. Dzięki za pomoc! – Mxracer888

+1

Bardzo proszę. '~' jest w istocie negacją w 'numpy-ish'. –

Powiązane problemy