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

