Python 如何在一个可以将numpy矩阵转换为Pandas帧的类中创建一个方法?

Python 如何在一个可以将numpy矩阵转换为Pandas帧的类中创建一个方法?,python,python-3.x,pandas,numpy,methods,Python,Python 3.x,Pandas,Numpy,Methods,我试图定义一种方法,在这种方法中,我可以将numpy矩阵转换为Pandas数据帧 我有以下资料: import pandas as pd import numpy as np class Analisis(): def __init__(self, matriz = np.array([])): self.__matriz = matriz self.__filas = matriz.shape[0] self.__colum

我试图定义一种方法,在这种方法中,我可以将numpy矩阵转换为Pandas数据帧

我有以下资料:

import pandas as pd
import numpy as np

class Analisis():
    def __init__(self, matriz = np.array([])):
          self.__matriz = matriz
          self.__filas = matriz.shape[0]
          self.__columnas = matriz.shape[1]
    @property
    def matriz(self):
         return self.__matriz
    @property
    def filas(self):
         return self.__filas
    @property
    def columnas(self):
         return self.__columnas
    def as_data_frame (self):
        dataset = pd.DataFrame({'Columna1': data[:, 0], 'Columna2': data[:, 1], 'Columna3': 
        data[:, 2]})
        return dataset
我正在使用这个阵列:

data = Analisis(np.array([[5,78,34],[6,2,8],[36,9,60]]))
print(data.filas)
print(data.columnas)
print(data.matriz)
Analisis.as_data_frame
但我尝试了几种与Analisis.as_data_frame的组合,但都不起作用。只是试图找到文档,似乎这个方法还可以,但不起作用。有什么想法吗?

因为您正在定义一个方法,所以希望在对象上调用它:

data.as_data_frame()
但是您的定义使用了
数据
,大概是全局变量。但是您应该使用内部状态。所以,大概你想要的是赛尔夫

旁白:

停止使用双下划线和不必要的属性,所有这些都是样板,从一开始就违背了
属性的全部目的。在Python中,您的类应该如下所示:

class Analisis:
    def __init__(self, matriz=None): # watch out for mutable default arguments
        if matriz is None:
            self.matriz = matriz
        else:
            self.matriz = np.array([])
        self.filas = matriz.shape[0]
        self.columnas = matriz.shape[1]
现在,就您的方法而言,您希望:

class Analisis:

    def __init__(self, matriz=None): # watch out for mutable default arguments
        if matriz is None:
            self.matriz = np.array([])
        else:
            self.matriz = matriz
        self.filas = matriz.shape[0]
        self.columnas = matriz.shape[1]

    def as_data_frame (self):
        dataset = pd.DataFrame(
            {
                'Columna1': self.matriz[:, 0], 
                'Columna2': self.matriz[:, 1], 
                'Columna3': self.matriz[:, 2]
            }
        )
        return dataset
您可以将您的方法简化为:

    def as_data_frame (self):
        dataset = pd.DataFrame(
            self.matriz[:,:3],
            columns=['Columna1','Columna2','Columna3']
        )
        return dataset
注意,二维数组始终可以直接转换为数据帧:

>>> arr = np.array([[5,78,34],[6,2,8],[36,9,60]])
>>> pd.DataFrame(arr, columns=['Columna1', 'Columna2', 'Columna3'])
   Columna1  Columna2  Columna3
0         5        78        34
1         6         2         8
2        36         9        60
我怀疑你真正想要的是更具活力的东西,比如:

    def as_data_frame (self):
        columns = [f'Columna{i}' for i in range(1, self.columnas+1)]
        dataset = pd.DataFrame(self.matriz, columns=columns)
        return dataset
在行动中:

In [10]: class Analisis:
    ...:
    ...:     def __init__(self, matriz=None): # watch out for mutable default arguments
    ...:         if matriz is None:
    ...:             self.matriz = np.array([])
    ...:         else:
    ...:             self.matriz = matriz
    ...:         self.filas = matriz.shape[0]
    ...:         self.columnas = matriz.shape[1]
    ...:
    ...:     def as_data_frame (self):
    ...:         columns = [f'Columna{i}' for i in range(1, self.columnas+1)]
    ...:         dataset = pd.DataFrame(self.matriz, columns=columns)
    ...:         return dataset
    ...:
    ...:

In [11]: data = Analisis(np.array([[5,78,34],[6,2,8],[36,9,60]]))

In [12]: data.as_data_frame()
Out[12]:
   Columna1  Columna2  Columna3
0         5        78        34
1         6         2         8
2        36         9        60
因为您正在定义一个方法,所以希望在对象上调用它:

data.as_data_frame()
但是您的定义使用了
数据
,大概是全局变量。但是您应该使用内部状态。所以,大概你想要的是赛尔夫

旁白:

停止使用双下划线和不必要的属性,所有这些都是样板,从一开始就违背了
属性的全部目的。在Python中,您的类应该如下所示:

class Analisis:
    def __init__(self, matriz=None): # watch out for mutable default arguments
        if matriz is None:
            self.matriz = matriz
        else:
            self.matriz = np.array([])
        self.filas = matriz.shape[0]
        self.columnas = matriz.shape[1]
现在,就您的方法而言,您希望:

class Analisis:

    def __init__(self, matriz=None): # watch out for mutable default arguments
        if matriz is None:
            self.matriz = np.array([])
        else:
            self.matriz = matriz
        self.filas = matriz.shape[0]
        self.columnas = matriz.shape[1]

    def as_data_frame (self):
        dataset = pd.DataFrame(
            {
                'Columna1': self.matriz[:, 0], 
                'Columna2': self.matriz[:, 1], 
                'Columna3': self.matriz[:, 2]
            }
        )
        return dataset
您可以将您的方法简化为:

    def as_data_frame (self):
        dataset = pd.DataFrame(
            self.matriz[:,:3],
            columns=['Columna1','Columna2','Columna3']
        )
        return dataset
注意,二维数组始终可以直接转换为数据帧:

>>> arr = np.array([[5,78,34],[6,2,8],[36,9,60]])
>>> pd.DataFrame(arr, columns=['Columna1', 'Columna2', 'Columna3'])
   Columna1  Columna2  Columna3
0         5        78        34
1         6         2         8
2        36         9        60
我怀疑你真正想要的是更具活力的东西,比如:

    def as_data_frame (self):
        columns = [f'Columna{i}' for i in range(1, self.columnas+1)]
        dataset = pd.DataFrame(self.matriz, columns=columns)
        return dataset
在行动中:

In [10]: class Analisis:
    ...:
    ...:     def __init__(self, matriz=None): # watch out for mutable default arguments
    ...:         if matriz is None:
    ...:             self.matriz = np.array([])
    ...:         else:
    ...:             self.matriz = matriz
    ...:         self.filas = matriz.shape[0]
    ...:         self.columnas = matriz.shape[1]
    ...:
    ...:     def as_data_frame (self):
    ...:         columns = [f'Columna{i}' for i in range(1, self.columnas+1)]
    ...:         dataset = pd.DataFrame(self.matriz, columns=columns)
    ...:         return dataset
    ...:
    ...:

In [11]: data = Analisis(np.array([[5,78,34],[6,2,8],[36,9,60]]))

In [12]: data.as_data_frame()
Out[12]:
   Columna1  Columna2  Columna3
0         5        78        34
1         6         2         8
2        36         9        60

如何调用as_data_frame方法?我想看看结果?Juts尝试了Analisis.as_data_frame.dataset、Analisis.as_data_frame,但都不起作用。这是我最大的担忧。P.d.:thx表示旁白。@HeinerRomeroLeiva同样,它是一个方法,因此应该在实例上调用它<代码>数据。as_data_frame()
否,不起作用>回溯(上次调用):文件“”,分析中的第1行。as_data_frame()类型错误:as_data_frame()缺少1个必需的位置参数:“self”@HeinerRomeroLeiva再次
数据。as_data_frame()
。非
Analisis.as\u data\u frame()
。你明白我所说的实例方法是什么意思吗<代码>分析
是类,它不是instance@HeinerRomeroLeiva注意,
\uuuuuu init\uuuuu
中有一个bug,我修复了它。如何调用as\u data\u frame方法?我想看看结果?Juts尝试了Analisis.as_data_frame.dataset、Analisis.as_data_frame,但都不起作用。这是我最大的担忧。P.d.:thx表示旁白。@HeinerRomeroLeiva同样,它是一个方法,因此应该在实例上调用它<代码>数据。as_data_frame()否,不起作用>回溯(上次调用):文件“”,分析中的第1行。as_data_frame()类型错误:as_data_frame()缺少1个必需的位置参数:“self”@HeinerRomeroLeiva再次
数据。as_data_frame()
。非
Analisis.as\u data\u frame()
。你明白我所说的实例方法是什么意思吗<代码>分析是类,它不是instance@HeinerRomeroLeiva注意,
\uuuuu init\uuuu
中有一个bug,我修复了它