Python类实例化触发TypeError: __init__()缺少必填位置参数'df'问题
错误原因
- 直接报错是因为
RawToCSV类的构造方法__init__定义了两个必填位置参数path_和df,你实例化时raw = RawToCSV(input_path)仅传入了1个参数,缺少df参数。 - 代码还存在多处逻辑缺陷,会导致后续运行继续报错,统一修复如下:
修复要点
- 调整构造方法逻辑:
df是在raw_file_processing方法中生成的,不需要初始化时传入,移除__init__的df参数,默认初始化self.df为None即可 - 修正实例属性赋值:
raw_file_processing中生成的cls要赋值给实例属性self.cls,否则dataset_csv方法无法读取该变量 - 修正方法调用:类中定义的生成CSV方法名为
dataset_csv,不是data_csv,且该方法是实例方法,不需要额外传input_path参数 - 修复拼接逻辑:
pd.concat默认按行拼接,你需要按列拼接多组数据,要加axis=1参数 - 临时注释测量值处理的错误逻辑:原代码中
col是列名字符串,调用readline()会触发类型错误,这部分业务逻辑你可以根据实际需求后续自行调整
修复后完整代码
import re import pandas as pd import os import numpy as np input_path = "../input_data" class RawToCSV: def __init__(self, path_): self.measurement_df = None self.cls = None self.path_ = path_ self.df = None def raw_file_processing(self): # 直接用实例初始化时传入的路径,不需要重复传参 for root, dirs, files in os.walk(self.path_): for file in files: with open(os.path.join(root, file), "r") as data: self.df = pd.read_csv(data) # 'Class' refers to the independent variable cls_info = self.df.iloc[2] # Dummy-code the classes cls = pd.get_dummies(cls_info) # 赋值给实例属性,供其他方法调用 self.cls = cls # Create the ID series by concatenating columns 1-3 self.df = self.df.assign( ID=self.df[['cell_id:cell_id', 'region:region', 'tile_num:tile_num']].apply( lambda row: '_'.join([str(each) for each in row]), axis=1)) self.df = self.df.drop(columns=['cell_id:cell_id', 'region:region', 'tile_num:tile_num']) # 以下测量值处理逻辑存在语法错误,暂时注释,你可自行调整实现 # # Obtain measurement info # # Normalize data against blank/empty columns # # log-transform the data # for col in self.df.columns[9:]: # if re.findall(r"Blank|Empty", col): # background = self.df[col].values # else: # line = self.df[col].values # norm_data = line / background # self.measurement_df = pd.DataFrame(np.log2(norm_data), columns=[col]) return self.df["ID"], self.cls, self.measurement_df def dataset_csv(self): """Col 1: ID Col 2: class Col 3-n: measurements""" ids = self.df["ID"] id_col = ids.to_frame() cls_col = self.cls.to_frame() frames = [id_col, cls_col, self.measurement_df] # 按列拼接多组数据 dataset_df = pd.concat(frames, axis=1) # 直接写入文件,关闭索引输出 dataset_df.to_csv("../input_data/dataset.csv", index=False) return dataset_df if __name__ == "__main__": raw = RawToCSV(input_path) three_tuple = raw.raw_file_processing() dataset = raw.dataset_csv()
内容的提问来源于stack exchange,提问作者melololo
相关产品推荐
相关产品推荐

