Pandas DataFrame 的组合与子类

rea*_*ind 2 python class pandas

我正在尝试在 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)
Run Code Online (Sandbox Code Playgroud)

Bra*_*mon 6

在 中.tilt(),您使用self.iloc[::-1]. 然而,在这个实例方法的范围内,self只是一个简单的、简约的Python类,而不是一个DataFrame。self它对您对内部的局部变量所做的操作一无所知.arrange()

即使您b.arrange()首先调用,这也不会就地修改类实例;self它修改在 范围内调用的变量的本地副本.arrange()。那是:

>>> b = Board()
>>> b.arrange()
# ...
>>> isinstance(b, pd.DataFrame)
False
Run Code Online (Sandbox Code Playgroud)

查看Pandas 数据结构子类化指南。我建议使用组合,因为实际上 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]
Run Code Online (Sandbox Code Playgroud)

用法:

>>> 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
Run Code Online (Sandbox Code Playgroud)