首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用pd.DataFrame过滤不同的pd.DataFrame

如何使用pd.DataFrame过滤不同的pd.DataFrame
EN

Stack Overflow用户
提问于 2022-08-30 16:27:04
回答 2查看 38关注 0票数 2

我有一个包含数据的熊猫DataFrame和另一个DataFrame,其中每一行都可以解释为数据的筛选器:

代码语言:javascript
复制
data_df = pd.DataFrame([{'a':i%10, 'b':i%15} for i in range(30)])

filter_df = pd.DataFrame({'a':[3,4,5], 'b0':[5,6,8], 'b1':[15,10,11]})
filter_df
    a   b0  b1
0   3   5   15
1   4   6   10
2   5   8   11

就意味着

代码语言:javascript
复制
pd.concat([
data_df[(data_df.a==3) & data_df.b.between(5,15)],
data_df[(data_df.a==4) & data_df.b.between(6,10)],
data_df[(data_df.a==5) & data_df.b.between(8,11)]
])

现在,我需要的是一种将所有这些过滤器应用于data_df并生成DataFrame的方法。要做到这一点,一种方法是应用:

代码语言:javascript
复制
res = filter_df.apply(lambda x: data_df[(data_df.a==x['a']) & data_df.b.between(x['b0'], x['b1'])], axis=1)
res = pd.concat([x for x in res])

请注意,要使其工作,我必须连接一个结果列表,因为结果是包含每个行的返回值的Series,它可能是None、pd.Series或pd.DataFrame。有什么“更好”的方法吗?我希望得到类似于.reset_index()的东西,但似乎找不到正确的方法。此外,如果有一个更优雅/不同的方式比应用,我会很高兴。在现实中,data_df将在数百行发送或数百万行,而filter_df (我希望在1000行以下),但大多数情况下超过10行,如果这对性能有影响的话

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-30 16:31:29

您可以合并和查询:

代码语言:javascript
复制
data_df.merge(filter_df, on='a', how='right').query('b0 <= b <= b1')

或等效地,合并和loc筛选器:

代码语言:javascript
复制
(data_df.merge(filter_df, on='a', how='right')
        .loc[lambda x: x['b'].between(x['b0'], x['b1'])]
)

输出:

代码语言:javascript
复制
   a   b  b0  b1
1  3  13   5  15
2  3   8   5  15
5  4   9   6  10
8  5  10   8  11
票数 1
EN

Stack Overflow用户

发布于 2022-08-30 17:06:38

您可以使用布尔索引:

代码语言:javascript
复制
d = filter_df.set_index('a')

# is "a" in filter_df's a?
m1 = data_df['a'].isin(filter_df['a'])
# is b ≥ the matching b0 value in filter_df?
m2 = data_df['b'].ge(data_df['a'].map(d['b0']))
# is b ≤ the matching b1 value in filter_df?
m3 = data_df['b'].le(data_df['a'].map(d['b1']))

# keep if all conditions are True
data_df[m1&m2&m3]

产出:

代码语言:javascript
复制
    a   b
13  3  13
23  3   8
24  4   9
25  5  10
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73545690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档