假设以下人为设置:
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编写每个查询的单独查找上方。
答案 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