【问题标题】:TypeError: __init__() missing 1 required positional argument: 'df'类型错误:__init__() 缺少 1 个必需的位置参数:'df'
【发布时间】:2021-10-03 05:46:36
【问题描述】:

我想在dataset_csv 函数中调用df["ID"],然后使用dataset = RawToCSV.dataset_csv(input_path) 调用dataset_csv 函数。 df["ID"] 是在 raw_file_processing 函数中定义的。 我的代码引发了TypeError: __init__() missing 1 required positional argument: 'df' 错误。

import re
import pandas as pd
import os
import numpy as np

input_path = "../input_data"


class RawToCSV:

    def __init__(self, path_, df):
        self.measurement_df = None
        self.cls = None
        self.path_ = path_
        self.df = df

    def raw_file_processing(self, path_):

        # Open all the subfolders within path
        for root, dirs, files in os.walk(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)

                    # 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[9:]:
                        if re.findall(r"Blank|Empty", col):
                            background = col
                        else:
                            line = col.readline()
                            for dat in line:
                                norm_data = dat / background
                                self.measurement_df = np.log2(norm_data)

        return self.df["ID"], 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)
        data_csv = dataset_df.to_csv("../input_data/dataset.csv")

        return data_csv

raw = RawToCSV(input_path)
three_tuple = raw.raw_file_processing(input_path)
dataset = raw.data_csv()

追溯:

> --------------------------------------------------------------------------- TypeError                                 Traceback (most recent call
> last) /tmp/ipykernel_136/323215226.py in <module>
> ----> 1 raw = RawToCSV(input_path)
>       2 three_tuple = raw.raw_file_processing(input_path)
> 
> TypeError: __init__() missing 1 required positional argument: 'df'

【问题讨论】:

  • 你能解释一下self.df = self.df这行吗?
  • 亲爱的梅洛洛,我已经回答了你的问题。

标签: python pandas function class


【解决方案1】:

在这部分代码中:

dataset = RawToCSV.dataset_csv(input_path)

您正在使用类本身,但是您应该首先从类RawToCSV 实例化,如下所示:

rawToCSV = RawTOCSV(input_path)
dataset = rawToCSV.data_csv()

但你还有另一个错误。在类的构造函数中,__init__ 你已经用self.df 启动了self.df,后者尚未定义。
因此在这部分代码中,你会得到另一个错误(AttributeError: 'RawToCSV' object has no attribute 'df'):

def __init__(self, path_):
        self.measurement_df = None
        self.cls = None
        self.path_ = path_
        self.df = self.df     #  <----- 

【讨论】:

  • 我已经编辑了 init 函数来初始化self.df = df,但现在它提高了TypeError: __init__() missing 1 required positional argument: 'df'。请参阅已编辑的问题和回溯。谢谢
  • 您应该将df 传递给构造函数,如下所示:rawToCSV = RawTOCSV(input_path, df)。确保在传递之前定义了 df 变量。
  • 如何定义df?它在raw_file_processing 函数中定义为self.df_ = pd.read_csv(data),但我仍然收到name 'df' is not defined 错误。
  • df不需要在__init__中定义,在raw_file_processing函数中定义即可(raw_file_processing函数不需要修改)。只需从__init__ 中删除self.df = df 并从__init__ 采用的参数中删除df,如下所示:__init__(self, path_)
  • 嗨@melololo,你好吗?你的问题解决了吗?我的回答对你有用吗?如果是这样,如果您给我的答案投票?甚至选择它作为正确答案,我会非常高兴✅。干杯。 ?
【解决方案2】:

在这一行:

dataset = RawToCSV.dataset_csv(input_path)

您正在调用dataset_csv,就好像它是一个静态方法(在类而不是实例上调用它)。你传入input_path,我认为它是一个字符串。由于您像调用静态方法一样调用该方法,因此不会将实际的 self 值添加到调用中(您必须有一个对象才能以 self 的形式发送)。

这意味着您命名为selfdataset_csv 的一个参数正在接收input_path 的(字符串)值。

错误消息告诉您字符串input_path 没有成员.df,因为它没有。

根据当前类及其方法的设置方式,您需要底部的入口点代码如下所示:

raw = RawToCSV(input_path)
three_tuple = raw.raw_file_processing(input_path)
dataset = raw.dataset_csv()

不过,您可能希望重组您的类及其方法

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 2021-07-06
    • 2023-03-19
    • 2020-01-29
    • 2017-10-30
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多