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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:24:23