2017-03-16 8 views
1

Ich habe eine Serie aus:Auswahl aus einer Dataframe Pandas auf Basis von Hilfs Serie

ser = pd.Series(['a','b','c']) 
df = pd.DataFrame([['c',1],['d',2],['a',3]], columns=['first', 'second']) 

und will die Datenrahmen erhalten:

first second 
0 c  1 
1 a  3 

Das heißt, ich so etwas wie df[df.first in ser.tolist()] sagen will, aber unter Berücksichtigung, dass df.first ein Series und kein Element davon ist.

Antwort

1

Option 1
query

df.query('first in @ser') 

Option 2
isin

df[df['first'].isin(ser)] 

ergeben Sowohl

first second 
0  c  1 
2  a  3 

Timing-Referenz

def query(): 
    return df.query('first in @ser') 

def isin(): 
    return df[df['first'].isin(ser)] 


results = pd.DataFrame(
    index=pd.Index([10, 1000, 100000], name='group size'), 
    columns=pd.Index(['query', 'isin'], name='method'), 
) 

from timeit import timeit 

for i in results.index: 
    df = pd.DataFrame(dict(first=np.random.randint(10, size=i))) 
    s = pd.Series(range(5)) 
    for j in results.columns: 
     results.set_value(
      i, j, 
      timeit(
       '{}()'.format(j), 
       'from __main__ import {}, df, s'.format(j), 
       number=100 
      ) 
     ) 

results.plot() 

enter image description here

+0

Danke. Nur um für zukünftige Benutzer zu erwähnen, dass Option 2 deutlich schneller ist als Option 1: 438 μs gegenüber 1,34 ms. – splinter

+0

@splinter Vergessen Sie nicht, die Antwort zu akzeptieren und upvote, wie Sie angemessen sehen. – piRSquared

+0

@piSquared, keine Sorgen, die ich nicht vergesse. Schönes Grundstück auch :) – splinter

Verwandte Themen