Python pandas for循环筛选列≤6值时报str与int比较TypeError求解
问题解决方案
错误原因
报错TypeError: '<=' not supported between instances of 'str' and 'int'的核心原因是你选中的11个列中存在数据类型为object的列,列内存有字符串类型值,无法直接和整数6做大小比较。你单独测试Pontualidade列正常,仅代表该列是数值类型,不能代表其余10列类型均合法。
另外你的原始代码还存在两处逻辑错误:
- 计算符合<=6条件行数的代码没有赋值给
total_parcial变量,直接调用会抛出变量未定义的错误 - 原有百分比计算逻辑为
df2[coluna].count() / df2[coluna].count(),结果恒等于1,不符合统计要求
修复代码
第一步:统一转换目标列类型为数值型
先将目标列全部转为数值类型,无法转换的异常值自动设为空值NaN,避免比较报错:
import pandas as pd colunas = list(df2.columns[8:19]) # 批量转换目标列为数值类型 for col in colunas: df2[col] = pd.to_numeric(df2[col], errors='coerce')
第二步:修正循环统计逻辑
lista = [] for coluna in colunas: nome_coluna = coluna # 统计<=6的行数 total_parcial = df2.loc[df2[coluna] <= 6].shape[0] # 统计当前列的有效非空值总数 total_valido = df2[coluna].count() # 计算百分比,增加除以0的异常处理 percentual = total_parcial / total_valido if total_valido != 0 else 0 lista.append([nome_coluna, total_parcial, percentual]) df_new = pd.DataFrame(data=lista, columns=['nome_coluna','total_parcial','percentual'])
更高效的向量化实现(无需for循环)
pandas原生支持向量化批量运算,不用循环遍历列,执行效率更高:
# 批量判断所有目标列的值是否<=6 mask = df2[colunas] <= 6 # 按列统计符合条件的行数 total_parcial = mask.sum() # 按列统计有效非空值总数 total_valido = df2[colunas].count() # 批量计算百分比 percentual = total_parcial / total_valido.replace(0, pd.NA) # 生成结果表 df_new = pd.DataFrame({ 'nome_coluna': total_parcial.index, 'total_parcial': total_parcial.values, 'percentual': percentual.values })
内容的提问来源于stack exchange,提问作者Tom AL
相关产品推荐
相关产品推荐

