pandas for循环筛选DataFrame大于0数值触发TypeError解决
问题说明
需要通过for循环实现功能:提取DataFrame中所有大于0的数值对应的列名,整理为列表返回。编写的代码运行触发类型错误,原代码如下:
col=df.columns for i in col: Liste=[] index=[] for j in range(40): if i[j] != 0: Liste=Liste + i[j] index=index + j i=zip(index,Liste)
报错信息
运行代码触发如下类型错误:
TypeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_98056/4001655036.py in <module> 5 for j in range(40): 6 if i[j] != 0: ----> 7 Liste=Liste + i[j] 8 index=index + j 9 i=zip(index,Liste) TypeError: can only concatenate list (not "str") to list
错误原因
- 变量取值逻辑完全错误:外层循环
for i in col中,i是遍历得到的列名字符串,不是列对应的Series数据。i[j]取到的是列名字符串的第j个字符(比如列名是price,i[0]就是字符p),根本不是单元格的数值,这是触发报错的直接原因——你尝试把字符串类型的字符和列表做拼接,类型不匹配。 - 列表操作方法错误:列表的
+运算符要求两边都是可迭代的同类型序列,你直接把单个值(字符、数值)和列表相加,就算取值正确也会触发类型错误,单个元素追加到列表应该用.append()方法。 - 变量初始化位置错误:
Liste=[]和index=[]写在了外层循环内部,每次遍历新列时都会把之前存储的结果清空,最终无法累计全量结果。 - 逻辑和需求不匹配:一是硬编码
range(40)遍历行,若DataFrame行数不是40会触发索引越界;二是判断条件写的是!=0,和需求要求的「大于0」不符。 - 结果存储逻辑错误:循环末尾直接把循环变量
i覆盖为zip对象,没有把结果存到外部容器,循环结束后无法获取任何有效输出。
修复代码
基于for循环的实现(匹配原代码编写思路)
# 结果列表初始化放在循环最外层,避免被重复清空 col_result = [] # 外层遍历列,col_name是列名,df[col_name]才是该列的全部数据 for col_name in df.columns: current_col = df[col_name] # 遍历当前列的行索引和对应值,无需硬编码行数 for row_idx, val in current_col.items(): # 按需求筛选大于0的值 if val > 0: col_result.append(col_name) # 如果只需要不重复的列名,找到第一个符合条件的值即可跳出当前列循环,提升运行效率 break
Pandas原生简洁实现(无强制for循环要求时推荐)
# 筛选出至少存在一个大于0值的列,直接转为列表 col_result = df.columns[df.gt(0).any()].tolist()
内容的提问来源于stack exchange,提问作者Harun T.
相关产品推荐
相关产品推荐

