2016-09-03 53 views
5

Đây là giao diện của DataFrame tôi:bằng len() trong Pandas 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 

và tôi muốn liệt kê một danh sách các thượng nghị sĩ mà họ có chiều dài hơn 9 ký tự.

Vì vậy, tôi nghĩ rằng mã nên được như thế này:

df[len(df.Surname) >9] 

nhưng điều này làm nảy sinh một KeyError, nơi nào tôi đi sai?

+0

Bạn cũng có thể làm 'df [df [ 'Họ']. Áp dụng (len)> 9]' bằng cách đó đánh giá mỗi chuỗi hiện diện trong loạt và trả về 'TRUE' nếu điều kiện được thỏa mãn. –

Trả lời

11

Cách đúng để lọc một DataFrame dựa vào độ dài của chuỗi trong một cột là

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

df['Surname'].str.len() tạo ra một loạt các độ dài cho cột họ và df[df['Surname'].str.len() > 9] lọc ra những cái nhỏ hơn hoặc bằng 9 Những gì bạn đã làm là kiểm tra độ dài của chính Series (số hàng nó có).

+1

nhưng nếu tôi muốn xuất một danh sách các thượng nghị sĩ có thứ tự được bầu là 6, tôi có thể sử dụng df [df.ElectedOrder == 6], df.ElectedOrder cũng là một chuỗi, tại sao len() là đặc biệt? – Dong

+0

Khi bạn làm 'df ['ElectedOrder'] == 6', gấu trúc đang quá tải toán tử' == 'để trả về một phần tử so sánh bình đẳng khôn ngoan. len không phải là đặc biệt. Nó chỉ là 'len' là có ý nghĩa trên chính Series (chiều dài của Series/mảng numpy). Nhưng một Series không thể bằng 6. Vì vậy, 'df ['Họ'] .__ len __()' được định nghĩa theo cách đó. – ayhan

+0

'len (df)' trả về kết quả tương tự như 'len (df ['Họ'])' tức là số hàng. Điều này là do 'df ['Họ']' là một 'Dòng' (đối tượng cột). Bạn muốn áp dụng 'len' vào các chuỗi trong cột, do đó bạn sử dụng' .str' – Lucidnonsense

0

Hãy xem hàm python filter. Nó thực hiện chính xác những gì bạn muốn.

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

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

Sytse