如何在保留首列文本列的同时移除DataFrame中的全零列?
解决方法:保留第一列并移除全零数值列
嘿,这个需求太常见了,尤其是处理大宽表的时候!我给你几个直接能用的pandas方案,完美适配你的场景——保留文本类型的第一列,删掉其他所有全是0的数值列:
方案1:拆分+筛选+合并(直观易懂)
先把第一列单独提出来,再筛选出非全零的数值列,最后合并回去,逻辑清晰,新手也能快速理解:
import pandas as pd # 提取第一列(文本列) first_column = DC5_prod.iloc[:, 0] # 筛选出除第一列外,至少有一个非零值的列 non_zero_numeric_cols = DC5_prod.iloc[:, 1:].loc[:, (DC5_prod.iloc[:, 1:] != 0).any(axis=0)] # 合并得到清理后的DataFrame cleaned_DC5 = pd.concat([first_column, non_zero_numeric_cols], axis=1)
这里的核心逻辑是(DC5_prod.iloc[:,1:] != 0).any(axis=0):它会遍历每一列,检查是否存在至少一个非零值,返回的布尔数组刚好可以用来筛选我们需要保留的数值列。
方案2:单步筛选(更简洁)
如果想少写几行代码,也可以直接用布尔掩码一次性筛选所有需要保留的列:
# 构建筛选掩码:要么是第一列,要么是不全为0的数值列 keep_mask = (DC5_prod.columns == DC5_prod.columns[0]) | ~(DC5_prod.iloc[:, 1:] == 0).all(axis=0) # 直接筛选得到结果 cleaned_DC5 = DC5_prod.loc[:, keep_mask]
这里用~(DC5_prod.iloc[:,1:] ==0).all(axis=0)取反,意思是“不是全为0的列”,再和第一列的条件做或运算,就能精准保留我们要的列。
小提示
如果你的数值列偶尔有非数值类型混入(比如字符串),可以先把它们转成数值类型,避免筛选出错:
# 把除第一列外的列转成数值,无法转换的会变成NaN(你可以根据需求处理NaN) DC5_prod.iloc[:, 1:] = DC5_prod.iloc[:, 1:].apply(pd.to_numeric, errors='coerce')
内容的提问来源于stack exchange,提问作者Franchise
相关产品推荐
相关产品推荐

