2017-10-23 8 views
1

는 다음과 같은 인위적인 설정한다고 가정팬더에서 Groupby 기준을 필터링하는 방법은 무엇입니까?

import pandas as pd 
d = {'fname': ['bob', 'Bob', 'larry', 'LARRY', 'Larry', 'Dick'], 
    'lname': ['harris', 'Larson', 'Douglas', 'REDMOND', 'Beal', 'Dyke']} 
df = pd.DataFrame(d) 
g = df.groupby(df.fname.str.lower()) 

query = ['bob', 'dick', 'chris'] 

일반 영어를, 나는 경우 변경 사항을 무시하고, 이름 쿼리에있는 항목에 대한 전체 Dataframe의보기를 만들려고합니다. 나는 (I 생각) 찾아 하나의 DataFrame에 query의 항목에 해당하는 그룹을 결합 g에 효율적이고 관용적 filter()에 해당하는 작업을 수행하고자하는, 즉 :

fname lname 
0 bob harris 
1 Bob Larson 
5 Dick  Dyke 

그러나, filter() (df이 크고 query이 작은 경우 중요) 그룹의 전체 집합을 반복하는 것처럼 보이며 어쨌든 filter()에서 그룹 이름에 액세스 할 수없는 것으로 보입니다.

내가 가지고 올 수있는 최선 :

pd.concat([pd.DataFrame()] + map(lambda y: g.get_group(y), 
           filter(lambda x: x in g.groups, query))) 

하지만이 효율적이거나 관용적 아닙니다 생각한다.

UPDATE :

나는이 백업 현실 세계의 문제에서, df 매우 큰 하나가 발생한 것을 명확히해야하지만, 여러 독립적 인 작은 query 인스턴스가

. isin은 단 하나의 쿼리에 대해서는 정상적으로 작동하지만 위의 맵/필터 콤보로 작성된 쿼리에 대한 개별 조회가 한 번이어서 Groupby을 사용하여 상당한 속도 향상을 발견했습니다.

답변

1

여기에 뭔가 빠졌는지 모르겠지만 isin을 사용하여 간단한 부울 인덱싱을 수행 할 수 있습니다.

df[df.fname.str.lower().isin(query)] 

    fname lname 
0 bob  harris 
1 Bob  Larson 
5 Dick Dyke 
+0

나는 overthought 가지가있을 수 있지만, 영업 이익은 데이터를 그룹화하는 이유을 한 것으로 가정했다. 나는 같은 선을 따라 갔다. +1 –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ, 예, OP가 무엇이 필요한지 아직 알지 못해요.하지만 groupby가 필요 없다고 느꼈습니다. – Vaishali

1
df[(df.fname.str.lower()).str.contains(r'|'.join(query),regex=True)] 
Out[20]: 
    fname lname 
0 bob harris 
1 Bob Larson 
5 Dick Dyke