2016-03-31 10 views
1

Ich habe zwei Fragen und sie sind beide in fett in der Post unten.Pandas: bevorzugte Idiome für Boolean/Prädikat sucht

Betrachten Sie diese DataFrame:

from pandas import DataFrame 

df_1 = DataFrame ({ 
     "x" : ["a - {}".format(i) for i in range(2)] + 
       ["b - {}".format(i) for i in range(2)] , 
     "y" : range(4) 
    }) 
df_1 

enter image description here

Angenommen, ich wollte, dass alle Zeilen, in denen der x Wert mit dem Buchstaben "a" gestartet.

Ist das Folgende das bevorzugte Idiom für eine solche Suche?

df_1[df_1["x"].apply(lambda val : val.startswith("a"))] 

enter image description here

Eine Sache, die ich in Pandas finden, ist, dass, sobald aussagekräftige Daten wird ein DataFrame Index, ist es schwieriger, Dinge mit ihm zu tun, vor allem es abfragen. Angenommen, wir haben jetzt:

df_2 = df_1.set_index(["x"], drop=True) 
df_2 

enter image description here

ich feststellen, dass die gleiche Suche zu tun, mehr Arbeit beteiligt ist, wenn ich den Index bin auf der Suche.

Ist das Folgende das bevorzugte Idiom für eine solche Suche?

df_2.iloc[[i for i,val in enumerate(df_2.index.tolist()) if val.startswith("a")], :] 

enter image description here

Antwort

1

In beiden Fällen würde ich die vektorisiert .str.startswith(...) Methode verwenden. Es ist nicht unbedingt so viel leistungsfähiger, nur sauberer. Siehe die für mehr.

In [22]: df_1[df_1["x"].str.startswith("a")] 
Out[22]: 
     x y 
0 a - 0 0 
1 a - 1 1 

In [23]: df_2[df_2.index.str.startswith('a')] 
Out[23]: 
     y 
x  
a - 0 0 
a - 1 1 
+0

Ich war mir dieser 'str' Methoden nicht bewusst. Dies eröffnet eine völlig neue Welt. Danke! –