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

Python Pandas:统计指定列范围每行非0值的最优实现方案

在Python Pandas中统计指定列范围每行非0值的最佳方法

先帮你理清问题所在:你用count(axis=1)来统计,但这个方法是统计每行非缺失值(NaN)的数量,而非非0值——当列里存在0时,它会被当成有效计数,这就导致结果不符合你的需求啦。

下面给你两种高效的解决方法,优先用第一种(Pandas向量化操作,速度更快):

方法一:向量化操作(推荐)

用ne(0)生成布尔矩阵,再按行求和:

data['activeYears'] = data[countRange].ne(0).sum(axis=1)
  • ne(0)会把每个元素和0比较,返回True(非0)或False(0);
  • sum(axis=1)把每行的True(等价于1)累加,得到的就是该行非0值的数量。

方法二:apply逐行处理(适合小数据集)

如果数据集不大,也可以用apply配合lambda实现:

data['activeYears'] = data[countRange].apply(lambda x: (x != 0).sum(), axis=1)

逻辑和方法一一致,只是逐行处理,大数据集下速度不如向量化操作。

验证结果

用你的测试数据运行后,activeYears列的结果应为:[3, 3, 3, 2, 1],完全符合每行非0值的统计需求。

你的原始尝试代码:

data = [[2015, 900, 2016, 850, 900, 850, 1000, 0, 0, -50, 50, -1000, 0], [2016, 500, 2017, 550, 0, 500, 550, 350, 0, 500, 50, -200, -350], [2017, 200, 2018, 300, 0, 0, 200, 300, 100, 0, 200, 100, -200], [2018, 775, 2019, 1000, 0, 0, 0, 775, 1000, 0, 0, 775, 225], [2019, 30, 2020, 0, 0, 0, 0, 0, 30, 0, 0, 0, 30]]
data = pd.DataFrame(data, columns = ['cohortYear', 'firstYearSales', 'firstFullYear', 'firstFullYearSales', '2015','2016','2017', '2018', '2019', '2016 Delta', '2017 Delta', '2018 Delta', '2019 Delta'])
countRange = data.columns[5:9]
data['activeYears'] = data[countRange].count(axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:12:43