【问题标题】:python class: run functions step by step and save thempython类:逐步运行函数并保存
【发布时间】:2021-07-21 14:11:32
【问题描述】:

我有一个读取数据帧的类,然后是另一个处理该数据帧的类。处理类中的函数应逐步应用于同一数据帧,以形成最终的数据帧,然后将其保存为 csv 文件。

from pydantic import BaseModel
from config import DATA_REPO
import pandas as pd
import os

class PandaDataFrame(BaseModel):
data: pd.DataFrame

      class Config:
          arbitrary_types_allowed = True

class Directory(BaseModel):
    data_directory: str

class DataToPandaReader(object):

    def csv_file_reader(self, directory: Directory):
        directory = directory.data_directory
        for file in os.listdir(directory):
            if file.endswith('.csv'):
               return pd.read_csv(os.path.join(directory, file))

class DataProcessor(object):

    def remove_punctuation(self, my_: PandaDataFrame):
        my_data_to_process = my_.data
        for col in my_data_to_process:
            if any(word in col for word in ['example', 'text', 'Answer']):
                my_data_to_process = my_data_to_process[col].str.replace('[^\w\s]', '', regex=True)
                return add_number_column(my_data_to_process)

    def add_number_column(self, my_: PandaDataFrame):
        my_data_to_process = my_.data
        my_data_to_process['sentence_number'] = range(len(my_data_to_process))
        return save_final_dataframe(my_data_to_process)

    def save_final_dataframe(self, my_:PandaDataFrame):
        my_data_to_process = my_.data
        return my_data_to_process.to_csv('final_data.csv')

def parse_data_process(directory_to_csv_file):
    toprocess = DataProcessor()
    toprocess.save_final_dataframe(directory_to_csv_file)
    toprocess.remove_punctuation(directory_to_csv_file)
    toprocess.add_number_column(directory_to_csv_file)
    return toprocess

if __name__ == '__main__':
    parse_data_process(PandaDataFrame(data= DataToPandaReader().csv_file_reader(Directory(data_directory = os.path.join(DATA_REPO, 'input_data')))))

现在,例如要实例化 DataProcessor 类中的第一个函数,我将执行以下操作

DataProcessor().remove_punctuation(PandaDataFrame(data= DataToPandaReader().csv_file_reader(Directory(data_directory = os.path.join(DATA_REPO, 'input_data')))))

但我的意图是在 DataProcessor 类中逐步运行所有这些函数,因此 save_final_dataset 函数将保存已删除标点符号并具有数字列的数据帧。

更新:

按照给出的答案,我进行了这些更改,但得到了函数未知的错误。

def parse_data_process(directory_to_csv_file):
    toprocess = DataProcessor()
    toprocess.save_final_dataframe(directory_to_csv_file)
    toprocess.remove_punctuation(directory_to_csv_file)
    toprocess.add_number_column(directory_to_csv_file)
    return toprocess

if __name__ == '__main__':
    parse_data_process(PandaDataFrame(data= DataToPandaReader().csv_file_reader(Directory(data_directory = os.path.join(DATA_REPO, 'input_data')))))

【问题讨论】:

  • 我们需要查看您的完整代码以了解此处的问题。
  • 这是完整的代码,我只是将更新部分的部分添加到我在这里发布的原始代码中
  • def parse_data_process(directory_to_csv_file): toprocess = DataProcessor() return toprocess.remove_punctuation(directory_to_csv_file) 这就是你所需要的,因为 remove_punctuation 以正确的顺序调用其他函数
  • 非常感谢,我改了def parse_data_process,但还是报错:NameError: name 'add_number_column' is not defined
  • 我错过了你将你的函数放在一个类中的事实(我认为没有必要)。因此,解决方案是使用“self”来限定函数调用。

标签: python pandas function class


【解决方案1】:

除非我误解了你的用例,否则你需要做的就是替换

return my_data_to_process

...在 remove_punctuation 函数中使用

return add_number_column(my_data_to_process)

...然后替换

return my_data_to_process

...在 add_number_column 函数中使用

return save_final_dataframe(my_data_to_process)

【讨论】:

  • 非常感谢您的回复,我尝试了您的建议并在类外编写了一个函数来实例化 DataProcessor 类,但是在以前的函数中添加函数名称时出现错误。请看更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多