python - 如何在可以将 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 的组合,但它们都不起作用。刚刚尝试查找文档,似乎该方法还可以,但不起作用。任何想法?
解决方案
由于您正在定义一个方法,因此您希望在您的对象上调用它:
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
推荐阅读
- angular - 单元格编辑器框架无法显示在网格上
- python - 在 Windows 7 中将 python 脚本作为服务启动时出错
- actions-on-google - Dialogflow 函数:无法读取未定义的属性“客户端”
- angular - 禁用按钮每次都不起作用
- wordpress - 特色图片始终显示在自定义帖子模板中
- javascript - 在javascript中按字母顺序对数组及其对象键进行排序
- ruby - 如何使用正则表达式从字符串中提取域部分
- java - 在 Spring Boot 中具有 jar 文件之外的配置文件
- icons - 我在哪里可以找到所有垫子图标的列表——Angular
- c# - 带有来自父数据集的子报告的 RDLC 报告?