2016-09-03 5 views
5

Dies ist das Aussehen meiner DataFrame:mit len ​​() in Pandas Datenrahmen

 
    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 

und ich möchte eine Liste der Senatoren aufzulisten, deren Namen mehr als 9 Zeichen lang ist.

Also ich denke, der Code wie folgt sein sollte:

df[len(df.Surname) >9] 

aber dies wirft eine KeyError, wo habe ich falsch gemacht?

+0

Sie können tun 'df auch [df [ 'Name']. Anwenden (len)> 9]' durch die Art und Weise, die jede Saite in der Serie und kehrt 'true' auswertet, wenn Die Bedingung ist erfüllt. –

Antwort

11

Der richtige Weg, um einen Datenrahmen auf der Grundlage der Länge der Zeichenkette in einer Spalte zu filtern ist

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

df['Surname'].str.len() eine Reihe von Längen für den Nachnamen Spalte erzeugt und df[df['Surname'].str.len() > 9] filtern diejenigen weniger als oder gleich 9 Was Sie getan haben, ist die Länge der Serie selbst zu überprüfen (wie viele Zeilen es hat).

+1

aber wenn ich eine Liste von Senatoren ausgeben möchte, deren gewählte Reihenfolge 6 ist, kann ich df [df.ElectedOrder == 6] verwenden, df.ElectedOrder ist auch eine Serie, warum len() ist speziell? – Dong

+0

Wenn Sie 'df ['ElectedOrder'] == 6 'ausführen, überlädt Pandas den Operator' ==, um einen elementweisen Gleichheitsvergleich zurückzugeben. len ist nicht besonders. Es ist nur so, dass "len" für die Serie selbst bedeutsam ist (Länge der Reihe/das numpy Array). Aber eine Reihe kann nicht gleich 6 sein. So ist 'df ['Nachname'] .__ len __()' so definiert. – ayhan

+0

'len (df)' liefert das gleiche Ergebnis wie 'len (df ['Nachname'])' d. H. Die Anzahl der Zeilen. Dies liegt daran, dass 'df ['Nachname']' eine 'Serie' (Spaltenobjekt) ist. Sie wollen 'len' auf die Strings in der Spalte anwenden, also verwenden Sie' .str' – Lucidnonsense

0

Werfen Sie einen Blick auf die Python filter Funktion. Es macht genau das, was du willst.

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

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

Sytse

Verwandte Themen