Pandas DataFrame类tilt方法报错:'对象无iloc属性'问题排查
解决"object has no attribute 'iloc'"错误的方案
我来帮你搞定这个问题!你遇到的错误根源在于你没有正确地在Board类实例中存储DataFrame对象,而是错误地直接给self赋值了——这在Python类里可不是这么玩的,咱们一步步来修正:
错误原因分析
在arrange方法里,你写了self = board.copy(),这只是在当前方法的局部作用域内把self变量重新指向了一个DataFrame对象,但Board类的实例本身并没有被修改,也没有新增一个存储DataFrame的属性。所以当你调用tilt方法时,self仍然是Board类的实例(而不是DataFrame),自然没有iloc这个DataFrame专属的属性,于是报错。
修正后的代码
import numpy as np import pandas as pd class Board(): def __init__(self): # 初始化一个实例属性来存储棋盘的DataFrame self.board = None def arrange(self): board = pd.DataFrame(np.arange(1,65).reshape(8,8), index=[1,2,3,4,5,6,7,8], columns=[1,2,3,4,5,6,7,8]) # 把DataFrame赋值给实例属性self.board,而不是直接给self赋值 self.board = board.copy() self.board.loc[1] = ['BP1','BP2','BP3','BP4','BP5','BP6','BP7','BP8'] self.board.loc[2] = ['blR','blK','blB','bQ','bK','brB','brK','brR'] self.board.loc[7] = ['wlR','wlK','wlB','wK','wQ','wrB','wrK','wrR'] self.board.loc[8] = ['WP1','WP2','WP3','WP4','WP5','WP6','WP7','WP8'] print(self.board) def tilt(self): # 操作实例属性里的DataFrame,iloc[::-1]会返回翻转后的新DataFrame tilted_board = self.board.iloc[::-1] print(tilted_board) # 如果要永久修改实例里的棋盘,可以加上下面这行 # self.board = tilted_board
关键修改点说明
- 在
__init__方法中新增了self.board属性,专门用来存储棋盘的DataFrame,让类实例能持续持有这个数据的引用。 - 在
arrange方法里,把原本的self = board.copy()改成了self.board = board.copy(),这样DataFrame就被存在了实例属性中,而不是覆盖局部的self变量。 - 在
tilt方法里,通过self.board访问到DataFrame对象,再用iloc[::-1]完成上下翻转操作。注意iloc[::-1]是返回一个新的翻转后的DataFrame,如果你想让实例里的棋盘永久变成翻转后的状态,可以把结果重新赋值给self.board。
测试方式
你可以这样测试修正后的代码:
my_board = Board() my_board.arrange() print("--- 翻转后的棋盘 ---") my_board.tilt()
内容的提问来源于stack exchange,提问作者real_aravind
相关产品推荐
相关产品推荐

