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

