Pandas列名循环遍历报错求助:AttributeError问题排查
解决Pandas遍历列名时的AttributeError问题
首先,咱们先聊聊你遇到的AttributeError: 'DataFrame' object has no attribute 'I'错误——这大概率是你在循环里用了点号.来访问列,但点号只能用于固定的列名(比如clear.col1),当你用变量(比如i)指代列名时,Pandas会把这个变量名当成DataFrame的属性去查找,自然找不到就报错了。
错误代码示例(你可能写了类似这样的)
lista = list() for i in clear.columns: # 这里用了clear.i,Pandas会去找clear的i属性,而不是列名为i的列 count = clear[clear.i > lock.i.max()].shape[0] lista.append((i, count))
正确的循环实现方式
改用**方括号[]**来通过变量访问列,这样Pandas就会正确识别你要访问的是对应列名的列:
lista = list() # 遍历列名,因为clear和lock列名一致,遍历其中一个的columns就行 for col in clear.columns: # 用col变量通过方括号访问列 threshold = lock[col].max() count = clear[clear[col] > threshold].shape[0] lista.append((col, count))
更简洁的列表推导式写法
如果你想让代码更紧凑,可以用列表推导式一步完成:
lista = [(col, clear[clear[col] > lock[col].max()].shape[0]) for col in clear.columns]
额外优化:用sum()替代shape[0]
其实统计布尔序列的True数量,用sum()会更直观(因为True等价于1,False等价于0),效果和shape[0]完全一致:
lista = [(col, (clear[col] > lock[col].max()).sum()) for col in clear.columns]
这样写不仅代码更短,可读性也更好~
内容的提问来源于stack exchange,提问作者Darnok kkk
相关产品推荐
相关产品推荐

