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

统计DataFrame每行最后一个非零值之后的零的数量

解决方法

原始DataFrame:

indexjanfebmarcapril
One1700
two0870
three0001

需求:统计每行最后一个非零值之后的零的数量,最终结果如下:

indexnum
One2
two1
three0

方法一:向量化操作(高效)

利用pandas向量化方法处理,避免逐行循环,适合大规模数据集:

import pandas as pd

# 构造原始DataFrame
data = {
    'jan': [1, 0, 0],
    'feb': [7, 8, 0],
    'marc': [0, 7, 0],
    'april': [0, 0, 1]
}
df = pd.DataFrame(data, index=['One', 'two', 'three'])

# 反转列顺序,找到每行第一个非零值对应的原列索引
last_nonzero_col_idx = df.iloc[:, ::-1].ne(0).idxmax(axis=1).apply(df.columns.get_loc)

# 计算最后一个非零值之后的零的数量
df['num'] = df.shape[1] - last_nonzero_col_idx - 1

# 提取结果
result = df[['num']]
print(result)

方法二:逐行处理(直观)

数据量较小时,用apply逐行遍历逻辑更易懂:

import pandas as pd

data = {
    'jan': [1, 0, 0],
    'feb': [7, 8, 0],
    'marc': [0, 7, 0],
    'april': [0, 0, 1]
}
df = pd.DataFrame(data, index=['One', 'two', 'three'])

def count_trailing_zeros(row):
    # 从后往前遍历每行元素
    for idx in reversed(range(len(row))):
        if row.iloc[idx] != 0:
            # 返回后续零的数量
            return len(row) - idx - 1
    # 若整行都是零,返回总列数(本案例无此情况)
    return len(row)

df['num'] = df.apply(count_trailing_zeros, axis=1)
result = df[['num']]
print(result)

两种方法运行后均可得到期望结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:04:57