【问题标题】:How to return data from one definition to another one? [duplicate]如何将数据从一个定义返回到另一个定义? [复制]
【发布时间】:2021-10-22 23:42:56
【问题描述】:

我正在玩python,并试图制作一个简单的数据清理程序。我正在尝试将title 值从read_excel 模块传递给output 模块。但是,它一直说名字title is not defined。这是我的代码:

import os
import pandas as pd
import math

class Item():
    __name = ""
    __cost = 0
    __gender = ""
    __prime = ""

    def has_all_properties(self):
        return bool(self.__name and not math.isnan(self.__cost) and self.__gender and self.__prime)

    def clean(self,wanted_cost,wanted_gender,wanted_prime):
        return bool(self.__name and self.__gender == wanted_gender and self.__cost <= wanted_cost and self.__prime == wanted_prime)
    
    def __init__(self, name, cost, gender, prime):
        self.__name = name
        self.__cost = cost
        self.__gender = gender
        self.__prime = prime

    def __eq__(self, other):
        return (self.__name == other.__name and self.__cost == other.__cost and self.__gender == other.__gender and self.__prime == other.__prime)   
    def __hash__(self):
        return hash((self.__name, self.__cost, self.__gender, self.__prime))

    def __repr__(self):
        return f"Item({self.__name},{self.__cost},{self.__gender},{self.__prime})"

    def tuple(self): 
        return self.__name, self.__cost, self.__gender, self.__prime

def read_excel(filetype):
    cwd = os.path.abspath('') 
    files = os.listdir(cwd)  
    df = pd.DataFrame()
    for file in files:
        if file.endswith(filetype):
            df = df.append(pd.read_excel(file), ignore_index=True)
            df = df.where(df.notnull(), None)
            df = df[['name', 'cost', 'used_by', 'prime']]
    title = list(df.columns.values)
    print(title) 
    array = df.values.tolist()
    print(array)
    return array
    return output(title)

def process(array):
    mylist = {Item(*k) for k in array}
    print(mylist)
    filtered = {obj for obj in mylist if obj.has_all_properties()}
    clean = {obj for obj in filtered if obj.clean(20,"male","yes")}
    result = list(clean)
    print(result)
    
def output(where, sort_data, title):
    t_list = [obj.tuple() for obj in sort_data]
    output = pd.DataFrame(t_list, columns = title)
    output.to_excel(where, index = False, header = True)

if __name__ == "__main__":
    inputfile = read_excel('.XLSX')
    processdata = process(inputfile)
    result = output('clean_data.xlsx', processdata, title)

你能告诉我该怎么做吗?谢谢你的帮助

【问题讨论】:

  • 您不能连续有两个return 语句。第一个退出函数,第二个永远不会执行。如果要从函数返回两个值,请执行return array, output(title)
  • 但是output() 不返回任何内容,它只是写入Excel 文件,那么您希望return output(title) 做什么?
  • @Barmar,感谢您的澄清。我要返回的是熊猫数据框的标题列表(我称其为标题以避免混淆),即['name','cost','used_by','prime']。我希望将此列表返回到输出定义,以便输出 excel 将具有相同的标题。
  • return output 在函数中。另外,避免对变量和函数使用相同的名称。
  • @Barmar 谢谢。你介意给我这行代码吗?

标签: python function return definition


【解决方案1】:

我发现解决当前问题的最容易理解的方法之一。所以,我只是分解了read_excel 的定义并做出了get_headerget_list 的定义。这是我的解决方案:

import os
import pandas as pd
import math

class Item():
    __name = ""
    __cost = 0
    __gender = ""
    __prime = ""

    def has_all_properties(self):
        return bool(self.__name and not math.isnan(self.__cost) and self.__gender and self.__prime)

    def clean(self,wanted_cost,wanted_gender,wanted_prime):
        return bool(self.__name and self.__gender == wanted_gender and self.__cost <= wanted_cost and self.__prime == wanted_prime)
    
    def __init__(self, name, cost, gender, prime):
        self.__name = name
        self.__cost = cost
        self.__gender = gender
        self.__prime = prime

    def __eq__(self, other):
        return (self.__name == other.__name and self.__cost == other.__cost and self.__gender == other.__gender and self.__prime == other.__prime)   
    def __hash__(self):
        return hash((self.__name, self.__cost, self.__gender, self.__prime))

    def __repr__(self):
        return f"Item({self.__name},{self.__cost},{self.__gender},{self.__prime})"

    def tuple(self): 
        return self.__name, self.__cost, self.__gender, self.__prime

def read_excel(filetype):
    cwd = os.path.abspath('') 
    files = os.listdir(cwd)  
    df = pd.DataFrame()
    for file in files:
        if file.endswith(filetype):
            df = df.append(pd.read_excel(file), ignore_index=True)
            df = df.where(df.notnull(), None)
            df = df[['name', 'cost', 'used_by', 'prime']]
    return df

def get_list(dataframe):
    array = dataframe.values.tolist()
    print(array)
    return array

def get_header(dataframe):
    title = list(dataframe.columns.values)
    print(title)
    return title

def process(array):
    mylist = {Item(*k) for k in array}
    print(mylist)
    filtered = {obj for obj in mylist if obj.has_all_properties()}
    clean = {obj for obj in filtered if obj.clean(20,"male","yes")}
    result = list(clean)
    print(result)
    t_list = [obj.tuple() for obj in result]
    return t_list

    
def output(where, sort_data, title): 
    output = pd.DataFrame(sort_data, columns = title)
    output.to_excel(where, index = False, header = True)
 
if __name__ == "__main__":
    inputfile = read_excel('.XLSX')
    array = get_list(inputfile)
    header = get_header(inputfile)
    processdata = process(array)
    result = output('clean_data.xlsx', processdata, header)

【讨论】:

    【解决方案2】:

    调用 return 后,您的函数将退出,因此您无法在从函数返回后添加任何语句。 你可以返回这两个像这样

    def read_excel(filetype):
    cwd = os.path.abspath('') 
    files = os.listdir(cwd)  
    df = pd.DataFrame()
    for file in files:
        if file.endswith(filetype):
            df = df.append(pd.read_excel(file), ignore_index=True)
            df = df.where(df.notnull(), None)
            df = df[['name', 'cost', 'used_by', 'prime']]
    title = list(df.columns.values)
    print(title) 
    array = df.values.tolist()
    print(array)
    return array, output(title)
    

    这将返回你的值的元组

    (array, output(title))
    

    【讨论】:

    • return output(title) 将始终返回 None,因此不应返回它并可能使用它。
    【解决方案3】:

    return 语句执行后,函数将立即退出。这意味着return output(title) 永远不会真正出现在您的代码中。同样,output() 不返回任何内容,DataFrame.to_excel() 仅写入 excel 文件。你想在read_excel()做的是

    def read_excel(filetype):
        cwd = os.path.abspath('') 
        files = os.listdir(cwd)  
        df = pd.DataFrame()
        for file in files:
            if file.endswith(filetype):
                df = df.append(pd.read_excel(file), ignore_index=True)
                df = df.where(df.notnull(), None)
                df = df[['name', 'cost', 'used_by', 'prime']]
        title = list(df.columns.values)
        print(title) 
        array = df.values.tolist()
        print(array)
        output(title)
        return array
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      相关资源
      最近更新 更多