如何过滤Pandas中的Groupby Criterion?

时间:2017-10-23 21:59:04

标签: python pandas pandas-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的视图,对于名字在查询中的条目,忽略大小写更改。 我(我想)我想在filter()上做一个有效且惯用的g来查找并将与query中的条目对应的组合并到一个DataFrame中,即:

   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)))

但我怀疑这不是有效的或惯用的。

更新:

我应该澄清一点,在支持这个问题的现实问题中,只有一个非常大的df,但是有几个独立的小query个实例。 isin可能只适用于一个查询,但我发现使用Groupby一次可以获得相当快的速度,然后使用map / filter combo编写每个查询的单独查找上方。

2 个答案:

答案 0 :(得分:1)

我不知道我是否遗漏了一些东西,但使用isin的简单布尔索引看起来已经足够了。

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

    fname   lname
0   bob     harris
1   Bob     Larson
5   Dick    Dyke

答案 1 :(得分: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