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

如何基于另一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中满足以下所有条件的行:

  1. Type为car、bike或motorbike;
  2. Amount值大于df2中对应Type列的Amount参数值;
  3. 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的结构:

TypeAmountCount
car303
bike404

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:22:54