我有一个包含数据的Pandas DataFrame和另一个DataFrame,其中每一行都可以解释为数据的过滤器:
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
将意味着
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的方法.其中一种方法是使用Apply:
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行,如果这对性能有影响的话