我正在尝试在Python类中创建一个名为“ tilt”的方法,该方法使用Pandas将DataFrame颠倒过来。但是,每当我在从此类创建的实例上使用此“倾斜”方法时,都会收到此错误“对象没有属性'iloc'”。
import numpy as np
import pandas as pd
class Board():
def __init__(self):
pass
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])
self = board.copy()
self.loc[1]=['BP1','BP2','BP3','BP4','BP5','BP6','BP7','BP8']
self.loc[2]=['blR','blK','blB','bQ','bK','brB','brK','brR']
self.loc[7]=['wlR','wlK','wlB','wK','wQ','wrB','wrK','wrR']
self.loc[8]=['WP1','WP2','WP3','WP4','WP5','WP6','WP7','WP8']
print(self)
def tilt(self):
self.iloc[::-1]
print(self)
答案 0 :(得分:4)
在.tilt()
中,您使用self.iloc[::-1]
。但是,在此实例方法的范围内,self
只是一个简单的简约Python类,而不是DataFrame。它对您对self
内的局部变量.arrange()
执行的操作一无所知。
即使您先调用b.arrange()
,也不会不就地修改类实例;它在self
范围内修改了名为.arrange()
的变量的本地副本。那就是:
>>> b = Board()
>>> b.arrange()
# ...
>>> isinstance(b, pd.DataFrame)
False
看看guide to subclassing Pandas data structures。我建议使用组合,因为实际上Pandas对象的子类化会很快变得毛茸茸。
这是一个组成看起来像的例子:
class Board(object):
def __init__(self):
self.board = pd.DataFrame(np.arange(1, 65).reshape(8, 8),
index=np.arange(1, 9),
columns=np.arange(1, 9))
def arrange(self):
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']
return self.board
def tilt(self):
return self.board.iloc[::-1]
用法:
>>> b = Board()
>>> b.arrange()
1 2 3 4 5 6 7 8
1 BP1 BP2 BP3 BP4 BP5 BP6 BP7 BP8
2 blR blK blB bQ bK brB brK brR
3 17 18 19 20 21 22 23 24
4 25 26 27 28 29 30 31 32
5 33 34 35 36 37 38 39 40
6 41 42 43 44 45 46 47 48
7 wlR wlK wlB wK wQ wrB wrK wrR
8 WP1 WP2 WP3 WP4 WP5 WP6 WP7 WP8
>>> b.tilt()
1 2 3 4 5 6 7 8
8 WP1 WP2 WP3 WP4 WP5 WP6 WP7 WP8
7 wlR wlK wlB wK wQ wrB wrK wrR
6 41 42 43 44 45 46 47 48
5 33 34 35 36 37 38 39 40
4 25 26 27 28 29 30 31 32
3 17 18 19 20 21 22 23 24
2 blR blK blB bQ bK brB brK brR
1 BP1 BP2 BP3 BP4 BP5 BP6 BP7 BP8