Pandas DataFrame的组成与子类

时间:2019-02-09 11:56:07

标签: python pandas class

我正在尝试在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)

1 个答案:

答案 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