2016-09-03 13 views
5

Jest to wyraz moich DataFrame:użyciu len() w Pandy dataframe

 
    StateAb GivenNm Surname     PartyNm PartyAb ElectedOrder 
35  WA  Joe BULLOCK Australian Labor Party  ALP    2 
36  WA Michaelia  CASH     Liberal  LP    3 
37  WA  Linda REYNOLDS     Liberal  LP    4 
38  WA  Wayne DROPULICH Australian Sports Party SPRT    5 
39  WA  Scott  LUDLAM   The Greens (WA)  GRN    6 

i chcę wymienić listę senatorów, których nazwisko jest długa więcej niż 9 znaków.

Więc myślę, że kod powinien być tak:

df[len(df.Surname) >9] 

ale to podnosi KeyError, gdzie popełniłam błąd?

+0

Można również zrobić 'df df [[ 'nazwisko']. Zastosowanie (len)> 9]' przez sposób, który ocenia każdą ciąg obecny w serii i zwraca TRUE jeśli ' warunek jest spełniony. –

Odpowiedz

11

Prawidłowy sposób filtrować DataFrame oparciu o długości strun w kolumnie jest

df[df['Surname'].str.len() > 9] 

df['Surname'].str.len() tworzy serię długościach dla kolumny nazwisku i df[df['Surname'].str.len() > 9] odfiltrowuje te mniejsze lub równe 9 To, co zrobiłeś, to sprawdzić długość samej serii (ile rzędów ma).

+1

ale jeśli chcę wypisać listę senatorów, których wybrana kolejność to 6, mogę użyć df [df.ElectedOrder == 6], df.ElectedOrder jest także serią, dlaczego len() jest wyjątkowy? – Dong

+0

Kiedy robisz 'df ['ElectedOrder'] == 6', pandy przeciążają operatora' == ', aby zwrócić porównanie równości elementów. len nie jest wyjątkowy. Po prostu 'len' ma sens w samej Serii (długość tablicy Series/numpy). Ale seria nie może równać się 6. Więc 'df ['Surname'] .__ len __()' jest zdefiniowany w ten sposób. – ayhan

+0

'len (df)' zwraca taki sam wynik, jak 'len (df ['Surname'])' tj. Liczba wierszy. Dzieje się tak, ponieważ 'df ['Surname']' to 'Series' (obiekt kolumny). Chcesz zastosować 'len' do ciągów znaków w kolumnie, więc użyjesz' .str' – Lucidnonsense

0

Zapoznaj się z funkcją python filter. Robi dokładnie to, co chcesz.

df = [ 
    {"Surname": "Bullock-ish"}, 
    {"Surname": "Cash"}, 
    {"Surname": "Reynolds"}, 
] 
longnames = list(filter(lambda s: len(s["Surname"]) > 9, df)) 
print(longnames) 

>>[{'Surname': 'Bullock-ish'}] 

Sytse