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

Python中基于特定条件筛选DataFrame数据子集的实现方法

Pandas 分组筛选实现方案

你可以直接基于pandas的分组能力完成需求,全程不需要写复杂循环,逻辑清晰易修改:

  • 第一步:导入pandas并构造示例数据(实际使用时替换成你自己的真实数据读取逻辑即可)
import pandas as pd

df = pd.DataFrame({
    'Type': [1,1,1,2,2,2,2,3,3,3,3],
    'Market': ['A','B','B','A','C','C','B','A','B','B','C'],
    'Price': [2,2,2,4,4,4,8,8,7,7,7]
})
  • 第二步:定义单组数据的校验规则,传入每个分组的Market列,返回布尔值代表该组是否需要保留
def check_group_valid(market_col):
    # 按出现顺序去重,保留每个市场值第一次出现的先后顺序
    first_appear_order = market_col.drop_duplicates(keep='first').tolist()
    market_set = set(first_appear_order)
    
    # 规则1:分组内只有A、B,不存在C
    if market_set == {'A', 'B'}:
        return True
    # 规则2:分组内包含A/B/C三类,且首次出现顺序为A→B→C
    if market_set == {'A', 'B', 'C'} and first_appear_order == ['A', 'B', 'C']:
        return True
    # 其余情况全部不符合要求
    return False
  • 第三步:执行分组筛选,拿到最终结果
# 生成逐行的匹配掩码,标记哪些行属于符合要求的分组
valid_mask = df.groupby('Type')['Market'].transform(check_group_valid).astype(bool)
final_df = df[valid_mask].reset_index(drop=True)

结果说明

运行后final_df会保留Type=1和Type=3的全部数据,Type=2的分组因为C出现在B之前,会被完全剔除,和预期结果完全一致:

TypeMarketPrice
1A2
1B2
1B2
3A8
3B7
3B7
3C7

注意:该逻辑默认当前DataFrame的行顺序就是业务上的真实先后顺序,如果你的数据之前做过乱序操作,需要先按时间/序号字段排序后再做分组判断,否则顺序校验结果会出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 21:24:30