You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一个DataFrame的阈值过滤Pandas目标DataFrame

按另一个DataFrame的阈值过滤Pandas DataFrame

你可以通过两种简洁的方式实现需求:

方法一:利用映射(Map)直接生成过滤掩码

这种方法无需合并DataFrame,直接通过字典映射匹配对应Type的阈值,执行效率更高:

import pandas as pd

df1 = pd.DataFrame({'Type': ['car', 'bike','car', 'motorbike','bike','bike'], 'Amount': [40,3,50, 699,60,90], 'Count': [10,1,2,4,3,2],'Item': ['a','b','t','u','i','e']})
df2 = pd.DataFrame({'Parameters': ['Amount', 'Count'], 'car': [30, 3], 'bike': [40,4], 'motorbike': [1000,7]}) 

# 从df2提取各Type的阈值字典
amount_thresholds = df2.set_index('Parameters').T['Amount'].to_dict()
count_thresholds = df2.set_index('Parameters').T['Count'].to_dict()

# 生成过滤条件掩码
mask = (df1['Amount'] > df1['Type'].map(amount_thresholds)) & (df1['Count'] < df1['Type'].map(count_thresholds))

# 应用掩码得到结果
dfTotal = df1[mask]
print(dfTotal)

方法二:合并DataFrame后过滤

这种方法逻辑更直观,适合需要查看每行对应阈值的场景:

import pandas as pd

df1 = pd.DataFrame({'Type': ['car', 'bike','car', 'motorbike','bike','bike'], 'Amount': [40,3,50, 699,60,90], 'Count': [10,1,2,4,3,2],'Item': ['a','b','t','u','i','e']})
df2 = pd.DataFrame({'Parameters': ['Amount', 'Count'], 'car': [30, 3], 'bike': [40,4], 'motorbike': [1000,7]}) 

# 转换df2结构,让Type作为匹配列,阈值列命名更清晰
threshold_df = df2.set_index('Parameters').T.rename_axis('Type').reset_index()
threshold_df.columns = ['Type', 'Amount_threshold', 'Count_threshold']

# 合并df1和阈值表
merged_df = df1.merge(threshold_df, on='Type')

# 应用过滤条件并移除阈值列
dfTotal = merged_df[(merged_df['Amount'] > merged_df['Amount_threshold']) & (merged_df['Count'] < merged_df['Count_threshold'])].drop(columns=['Amount_threshold', 'Count_threshold'])
print(dfTotal)

两种方法最终输出都与你期望的结果一致:

Type  Amount  Count Item
2     car      50      2    t
4    bike      60      3    i
5    bike      90      2    e

内容的提问来源于stack exchange,提问作者Marco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:47:44