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
相关产品推荐
相关产品推荐

