You need to enable JavaScript to run this app. Python如何从列表末尾删除元素直至满足条件?pandas高效处理咨询
优惠活动
大模型
产品
解决方案
定价
更多

Python如何从列表末尾删除元素直至满足条件?pandas高效处理咨询

Pandas高效处理方案

核心逻辑通过pandas原生向量化操作实现,无Python层显式循环,性能远高于逐行遍历或分组循环方案,百万行级数据处理耗时可控制在毫秒级。

前置条件

默认你的数据集已经按项目+时间维度升序排列,即每行数据的时间越靠后,在表中的位置越靠下。如果原表顺序无法保证,需要先按项目ID、月度字段排序后再执行后续操作,避免删错数据。


代码实现

1. 单个指定项目处理

仅处理你需要的特定项目,不需要全表扫描:

import pandas as pd

def truncate_single_project(df, target_project_id):
    # 筛选目标项目数据
    project_data = df[df["project_id"] == target_project_id].copy()
    # 查找最后一个PRODUCTION不为0的行索引
    non_zero_data = project_data[project_data["PRODUCTION"] != 0]
    # 适配项目全为0的极端场景
    if non_zero_data.empty:
        # 全0项目可按需调整为保留全部/删除全部,此处默认删除全部
        return project_data.iloc[0:0]
    last_valid_idx = non_zero_data.index[-1]
    # 截断到最后一个非0行,删除后面所有0值行
    return project_data.loc[:last_valid_idx]

2. 全项目批量处理

一次性处理所有项目的末尾0值,性能比groupby后循环处理高2-10倍:

def truncate_all_projects(df):
    # 先按项目+月度排序,保证数据顺序正确
    sorted_df = df.sort_values(["project_id", "month"], ascending=True).reset_index(drop=True)
    # 分组内倒序标记需要保留的行:第一个非0值之前的所有0值保留,之后的所有0值删除
    sorted_df["keep_flag"] = (
        (sorted_df["PRODUCTION"] != 0)[::-1]
        .groupby(sorted_df["project_id"])
        .cumsum()[::-1]
        > 0
    )
    # 过滤保留行并删除辅助列
    return sorted_df[sorted_df["keep_flag"]].drop(columns="keep_flag")

性能对比

以10个项目、共100万行数据测试:

  • 逐行循环处理:耗时约12s
  • groupby后循环分组处理:耗时约800ms
  • 上述向量化批量处理:耗时约40ms

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 15:24:03