首页 > 解决方案 > 如何使用 OOP 编程修复方法中的错误

问题描述

我有下面的代码,其中该get()方法旨在获取我的数据框中的所有值(这是一个充满数据的 excel 表),其中该 excel 单元格的内容以文本开头"AML"

class Settings3:
    def __init__(self,path):
        self.path = path
        self.data = self.load()
          
    def load(self):
        if self.path.endswith('.xlsx'):
            print ("This is a valid file path")
        else:
            raise Exception("This is not a valid file path")
        #LOAD WORKBOOK
        self.workbook = load_workbook(filename=self.path)
        # CREATE THE DICTIONARY TO HOLD DATAFRAMES\n",
        self.data_dict = {}
        # GO THROUGH SHEETS, STORING SHEETNAME AND DATAFRAME\n",
        for sheet in self.workbook.sheetnames:
            self.data_dict[sheet] = pd.read_excel(self.path, sheet_name=sheet)
        return self.data_dict

    def get(self,value):
        if value == None:
            return self.data
        elif value in self.workbook.sheetnames:
            df = pd.read_excel(self.path, value)
            return df
        elif value == "AML":
            for sheet_name in self.workbook.sheetnames:
                df = pd.read_excel(self.path,sheet_name)
                if "RULE_ID" in df.columns:
                    print(df.loc[df["RULE_ID"] == value])

目前,当我尝试 get 方法时s3.get("AML")s3用作该settings3对象的实例,我收到以下值作为输出

Empty DataFrame Columns: [RULE_ID, PARAM_ID, ROLE_ID, PARAM_NAME, ATTRIBUTE_NAME, ATTRIBUTE_VALUE, SQL] Index: []
Empty DataFrame Columns: [REGION_CD, RULE_ID, PARAM_ID, ROLE_ID, ATTRIBUTE_NAME, ATTRIBUTE_VALUE, TENANT_CD, SQL] Index: []
Empty DataFrame Columns: [REGION_CD, RULE_ID, PARAM_ID, ROLE_ID, PARAM_NAME, THRESHOLD_NAME, THRESHOLD_VALUE, TENANT_ID, SQL] Index: []
Empty DataFrame Columns: [REGION_CD, RULE_ID, PARAM_ID, PARAM_NAME, FROM_VALUE, SCORE, TENANT_ID, SQL] Index: []
Empty DataFrame Columns: [REGION_CD, RULE_ID, PARAM_ID, ROLE_ID, PARAM_NAME, THRESHOLD_NAME, POPULATION_GROUP_ID, THRESHOLD_VALUE, TENANT_ID, SQL] Index: []
Empty DataFrame Columns: [REGION_CD, RULE_ID, PARAM_ID, PARAM_NAME, POPULATION_GROUP_ID, FROM_VALUE, SCORE, TENANT_ID, SQL] Index: []
Empty DataFrame Columns: [RULE_ID, PARAM_ID, PARAM_NAME, ROLE_ID, ENTITY_KEY, THRESHOLD_NAME, THRESHOLD_VALUE, TENANT_ID, SQL] Index: []
Empty DataFrame Columns: [RULE_ID, PARAM_ID, PARAM_NAME, ENTITY_KEY, FROM_VALUE, SCORE, TENANT_ID, SQL] Index: []

应返回的值应如下所示(来自实际的 excel 表):

0   AML-ADR-ADR-ALL-A-M06-CUS
1   AML-ADR-ADR-ALL-A-M06-CUS
2   AML-ADR-ADR-ALL-A-M06-CUS
3   AML-ADR-ADR-ALL-A-M06-CUS

任何人都可以帮助解决为什么会这样吗?这一定是我的get()代码中的一个小错误。谢谢 :)

标签: pythonpandasdataframeopenpyxl

解决方案


您说您想获取以文本“AML”开头的所有值,但您的代码测试是否相等:

df["RULE_ID"] == value

这只会匹配包含确切“AML”字符串的单元格,而不是“AML_hello”或类似的任何内容。现在在 python 中,你有了startswith string 方法,它在这里会派上用场,但不幸的是,这不是 Series 上的矢量化操作。

所以诀窍是编写一个执行您想要的操作的函数:

f = lambda x: str(x).startswith('AML')

并将其应用于系列(替换代码的最后一行):

print(df.loc[df["RULE_ID"].apply(f)])

例如,转换为字符串str()只是为了避免在整数上崩溃。


推荐阅读