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

如何在Pandas DataFrame中按非零值数量生成标签列?

解决方法

你原来用max(axis=1)的思路只取每行最大值,没法区分单非零和多非零的行,自然达不到需求。要实现目标,核心是先判断每行非零值的个数,再针对性赋值。

步骤分解:

  • 计算每行非零值的数量:用df.ne(0).sum(axis=1),ne(0)把非零元素转为True,求和后得到每行非零值的个数。
  • 提取单非零行的数值:用df.where(df.ne(0)).sum(axis=1),where会把零值替换为NaN,求和后只剩那个非零值(NaN不参与求和)。
  • 条件赋值:用np.where判断,非零数量等于1时取对应值,否则赋值0。

完整代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1, 0, 0, 0, 0, 1, 0, 0, 0],
                   'B': [2, 2, 0, 0, 2, 0, 0, 0, 4],
                   'C': [0, 0, 3, 3, 0, 0, 0, 3, 2],
                   'D': [0, 0, 0, 4, 4, 0, 4, 0, 0],
                   'E': [0, 0, 0, 0, 0, 0, 0, 0, 5]})

# 统计每行非零值数量
non_zero_count = df.ne(0).sum(axis=1)
# 提取单非零行的数值
single_non_zero_val = df.where(df.ne(0)).sum(axis=1)
# 生成label列
df['label'] = np.where(non_zero_count == 1, single_non_zero_val, 0)

运行结果:

A  B  C  D  E  label
0  1  2  0  0  0      0
1  0  2  0  0  0      2
2  0  0  3  0  0      3
3  0  0  3  4  0      0
4  0  2  0  4  0      0
5  1  0  0  0  0      1
6  0  0  0  4  0      4
7  0  0  3  0  0      3
8  0  4  2  0  5      0

结果完全符合需求:单非零值的行(如索引1、2、5等)label取对应数值,多非零值的行label为0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:02:47