开发者社区> 问答> 正文

如何在可以将numpy矩阵转换为Pandas框架的类中创建方法?

我正在尝试定义一种方法,可以将numpy矩阵转换为Pandas DataFrame。

我有以下内容:

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的组合,但它们没有起作用。只是尝试查找文档,似乎该方法还可以,但是不起作用。任何想法?

问题来源:stackoverflow

展开
收起
is大龙 2020-03-23 16:48:37 891 0
1 条回答
写回答
取消 提交回答
  • 由于您正在定义方法,因此需要在对象上调用它:

    data.as_data_frame()
    

    但是您的定义使用data,大概是全局变量。但是您应该使用内部状态。因此,大概你想要self .__ matriz

    撇开:

    停止使用双下划线和不必要的属性,所有这些都是样板,完全违背了“ property”的全部目的。在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
    

    回答来源:stackoverflow

    2020-03-23 16:48:43
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
中文:即学即用的Pandas入门与时间序列分析 立即下载
即学即用的Pandas入门与时间序列分析 立即下载
低代码开发师(初级)实战教程 立即下载