如何基于另一DataFrame的参数条件过滤目标DataFrame?
问题:基于另一DataFrame的条件过滤DataFrame行
数据示例
import pandas as pd df1 = pd.DataFrame({'Type': ['car', 'bike','car', 'motorbike','bike'], 'Amount': [40, 3,50, 699,60], 'Count': [10, 1,2,4,4]}) df2 = pd.DataFrame({'Parameters': ['Amount', 'Count'], 'car': [30, 3], 'bike': [40,4]})
过滤需求
保留df1中满足以下所有条件的行:
- Type为
car、bike或motorbike;Amount值大于df2中对应Type列的Amount参数值;Count值大于df2中对应Type列的Count参数值;
预期结果:
dfTotal = pd.DataFrame({'Type': ['car'], 'Amount': [40], 'Count': [10]})
更新说明:当df1中存在相同Type但不同Amount、Count的行时,原有自定义解决方案失效,该如何处理?
解决方案
核心思路是先把df2转成易匹配的结构,再和df1关联后逐行验证条件,可兼容同Type多差异行的场景。
1. 重塑df2的结构
把df2从宽表转成窄表,让Type作为单独列,方便和df1关联:
# 转置df2并重置索引,调整列名 df2_transposed = df2.set_index('Parameters').T.reset_index().rename(columns={'index': 'Type'})
转置后df2的结构:
| Type | Amount | Count |
|---|---|---|
| car | 30 | 3 |
| bike | 40 | 4 |
2. 关联两个DataFrame
用merge按Type关联df1和转置后的df2,保留所有df1的行(motorbike行因无对应阈值后续会被过滤):
merged_df = df1.merge(df2_transposed, on='Type', how='left', suffixes=('', '_threshold'))
3. 应用过滤条件
设置规则逐一验证每行是否符合要求,同时排除无阈值的motorbike行:
filter_condition = ( df1['Type'].isin(['car', 'bike', 'motorbike']) & (merged_df['Amount'] > merged_df['Amount_threshold']) & (merged_df['Count'] > merged_df['Count_threshold']) & merged_df['Amount_threshold'].notna() ) dfTotal = df1[filter_condition].reset_index(drop=True)
效果验证
运行后dfTotal会精准保留符合条件的行——比如示例中第二个car行(Amount=50,Count=2)因Count小于阈值3被过滤,最终只保留第一个car行,完美适配同Type多差异行的场景。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

