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

如何移除DataFrame末尾值为0的行(保留中间0值行)

移除DataFrame末尾连续值为0的行(保留中间0行)

需求说明

给定包含Datetime和Value列的DataFrame,已通过小时级时间索引填充缺失值为0,现在需要:

  • 仅移除末尾连续值为0的行,中间值为0的行保留
  • 若最后一行值不为0,则不做任何处理

解决方案1:定位最后一个非0行索引

先找到最后一个Value不为0的行的索引,再截取到该行即可:

import pandas as pd

# 构造示例DataFrame
data = {
    'Datetime': pd.date_range(start='2024-01-01 00:00', periods=10, freq='H'),
    'Value': [1, 0, 3, 0, 5, 0, 0, 0, 0, 0]
}
df = pd.DataFrame(data)

# 获取最后一个非0行的索引
non_zero_rows = df[df['Value'] != 0]
if not non_zero_rows.empty:
    last_non_zero_idx = non_zero_rows.index[-1]
    df_cleaned = df.loc[:last_non_zero_idx]
else:
    # 所有行都是0的情况,保留全部行
    df_cleaned = df.copy()

逻辑说明

  1. 筛选出所有Value不为0的行,若存在这样的行,取其最后一个索引
  2. 使用loc[:last_non_zero_idx]截取从开头到该索引的所有行,自动剔除末尾的连续0行
  3. 若所有行都是0,直接保留原DataFrame(可根据需求调整)

解决方案2:反向累积标记法(更简洁)

利用反向累积最大值生成保留标记,无需手动定位索引:

# 生成保留标记:从末尾开始,只要出现过非0值,该行及之前的行都标记为True
mask = df['Value'][::-1].cummax().astype(bool)[::-1]

# 处理全0的特殊情况
if not mask.any():
    df_cleaned = df.copy()
else:
    df_cleaned = df[mask]

逻辑说明

  1. 将Value列反转后,用cummax()计算累积最大值:只要遇到非0值,后续(原数据的前序行)的累积最大值都会是非0
  2. 将累积结果转为布尔值,再反转回原顺序,得到的mask就是所有需要保留的行的标记
  3. 若mask全为False(所有值都是0),则保留原DataFrame

测试验证

  • 当最后一行Value不为0时,两种方案都会返回原DataFrame,符合需求
  • 当存在多个末尾连续0行时,会精准剔除这些行,中间的0行完全保留

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:06:13