假设以下人为设置:
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']
用简单的英语来说,我想为查询中的名字的条目创建整个数据框的 View ,忽略大小写更改。
我(认为我)想在 g
上执行高效且惯用的 filter()
操作,以查找并组合与 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,但有几个独立的小型查询实例。 isin
可能仅适用于一个查询,但我发现使用一次 Groupby
可以显着提高速度,然后对每个查询进行单独查找,如使用上面的 map /过滤器组合。
最佳答案
我不知道我是否在这里遗漏了一些东西,但使用 isin 的简单 bool 索引看起来就足够了。
df[df.fname.str.lower().isin(query)]
fname lname
0 bob harris
1 Bob Larson
5 Dick Dyke
关于python - 如何在 Pandas 中过滤 Groupby 标准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46899186/