使用自定义数据类方法操作 DataFrame
Manipulating DataFrame with custom dataclass methods
我有超过 4000 行代码来分析、操作、比较和绘制 2 个巨大的 .csv
文档。为了可读性和未来的出版,我想转换为面向对象的 classes。我将它们转换为 pd.DataFrames
:
my_data1 = pd.DataFrame(np.random.randn(100, 9), columns=list('123456789'))
my_data2 = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
我有比较每个数据集的各个方面的函数和只单独使用数据集的函数。我想使用每个数据帧的方法将此结构转换为数据class。
我无法通过 class 函数操作这些数据帧。我不断收到 NameError: name 'self' is not defined
。这是我的数据class结构:
@dataclass
class Data:
ser = pd.DataFrame
# def __post_init__(self):
# self.ser = self.clean()
def clean(self, ser):
acceptcols = np.where(ser.loc[0, :] == '2')[0]
data = ser.iloc[:, np.insert(acceptcols, 0, 0)]
data = ser.drop(0)
data = ser.rename(columns={'': 'Time(s)'})
data = ser.astype(float)
data = ser.reset_index(drop=True)
data.columns = [column.replace('1', '')
for column in ser.columns]
return data
my_data1 = pd.DataFrame(np.random.randn(100, 9), columns=list('123456789'))
my_data2 = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
# Attempt 1
new_data1 = Data.clean(my_data1) # Parameter "ser" unfilled
# Attempt 2
new_data1 = Data.clean(ser=my_data1) # Parameter "self" unfilled
# Attempt 3
new_data1 = Data.clean(self, my_data1) # Unresolved reference "self"
我尝试了各种形式的定义 def clean(self and other stuff)
,但我认为我对 classes 或 class 结构的理解还不够。 classes 和 dataclasses 上的文档总是使用非常基本的示例,我试过 cut/pasting 模板但无济于事。我错过了什么?
您可以先获取 class Data
的实例 x
。
x = Data()
# Attempt 1
new_data1 = x.clean(my_data1) # Parameter "ser" unfilled
# Attempt 2
new_data1 = x.clean(ser=my_data1) # Parameter "self" unfilled
如果我是你,我不会这样使用 class,我只会定义以下函数
def clean(ser):
acceptcols = np.where(ser.loc[0, :] == '2')[0]
data = ser.iloc[:, np.insert(acceptcols, 0, 0)]
data = ser.drop(0)
data = ser.rename(columns={'': 'Time(s)'})
data = ser.astype(float)
data = ser.reset_index(drop=True)
data.columns = [column.replace('1', '')
for column in ser.columns]
return data
然后直接调用。
另外,在你的clean()
中,每次修改都是基于ser
,这是输入,而不是最后一次修改。这是一个问题,不是吗?
我有超过 4000 行代码来分析、操作、比较和绘制 2 个巨大的 .csv
文档。为了可读性和未来的出版,我想转换为面向对象的 classes。我将它们转换为 pd.DataFrames
:
my_data1 = pd.DataFrame(np.random.randn(100, 9), columns=list('123456789'))
my_data2 = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
我有比较每个数据集的各个方面的函数和只单独使用数据集的函数。我想使用每个数据帧的方法将此结构转换为数据class。
我无法通过 class 函数操作这些数据帧。我不断收到 NameError: name 'self' is not defined
。这是我的数据class结构:
@dataclass
class Data:
ser = pd.DataFrame
# def __post_init__(self):
# self.ser = self.clean()
def clean(self, ser):
acceptcols = np.where(ser.loc[0, :] == '2')[0]
data = ser.iloc[:, np.insert(acceptcols, 0, 0)]
data = ser.drop(0)
data = ser.rename(columns={'': 'Time(s)'})
data = ser.astype(float)
data = ser.reset_index(drop=True)
data.columns = [column.replace('1', '')
for column in ser.columns]
return data
my_data1 = pd.DataFrame(np.random.randn(100, 9), columns=list('123456789'))
my_data2 = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
# Attempt 1
new_data1 = Data.clean(my_data1) # Parameter "ser" unfilled
# Attempt 2
new_data1 = Data.clean(ser=my_data1) # Parameter "self" unfilled
# Attempt 3
new_data1 = Data.clean(self, my_data1) # Unresolved reference "self"
我尝试了各种形式的定义 def clean(self and other stuff)
,但我认为我对 classes 或 class 结构的理解还不够。 classes 和 dataclasses 上的文档总是使用非常基本的示例,我试过 cut/pasting 模板但无济于事。我错过了什么?
您可以先获取 class Data
的实例 x
。
x = Data()
# Attempt 1
new_data1 = x.clean(my_data1) # Parameter "ser" unfilled
# Attempt 2
new_data1 = x.clean(ser=my_data1) # Parameter "self" unfilled
如果我是你,我不会这样使用 class,我只会定义以下函数
def clean(ser):
acceptcols = np.where(ser.loc[0, :] == '2')[0]
data = ser.iloc[:, np.insert(acceptcols, 0, 0)]
data = ser.drop(0)
data = ser.rename(columns={'': 'Time(s)'})
data = ser.astype(float)
data = ser.reset_index(drop=True)
data.columns = [column.replace('1', '')
for column in ser.columns]
return data
然后直接调用。
另外,在你的clean()
中,每次修改都是基于ser
,这是输入,而不是最后一次修改。这是一个问题,不是吗?