【问题标题】:Cleaning up multiple functions and lambdas in Jupyter Notebook在 Jupyter Notebook 中清理多个函数和 lambda
【发布时间】:2023-01-07 01:25:11
【问题描述】:

我的公司跟踪第 3 方系统中的拒绝问题。任何给定的工单都可能有多种拒绝原因。我的同事将拒绝的工单列表导出到 Excel 文件,最终用于数据可视化。

我创建了一个 Jupyter Notebook 文件,该文件会将原因拆分为真或假的单独列。目前有 10 个可能的原因,所以我有 10 个单独的函数来检查每个值是否为真,并运行 10 个单独的 lambda。它工作完美,但不是很干净或可维护。

我正在努力寻找正确的方法(甚至只是一种可行的方法)将所有这些函数和 lambda 组合成一组更清晰的代码。

我有一系列 10 个功能,每个功能一个,几乎相同:

def reason_one (x):
    
    value = 0
    
    if 'reason_one' in x:
        value = 1
    else:
        pass
        
    return value
def reason_two (x):
    
    value = 0
    
    if 'reason_two' in x:
        value = 1
    else:
        pass
        
    return value

依此类推,我们目前使用的所有 10 个原因。

然后,我运行 10 个几乎相同的 lambda,一个接一个:

df['Reason One'] = df['Labels'].map(lambda x: reason_one(x))
df['Reason Two'] = df['Labels'].map(lambda x: verification(x))

有没有办法清理这个?理想情况下,我想创建一个字典,其中包含所有原因代码和应命名的列,然后循环遍历数据框上的标签列以获取每个可能的值,每次添加一列。

我有我的字典设置:

error_list = {
    'reason_one': 'Reason One',
    'reason_two': 'Reason Two',
    'reason_three': 'Reason Three',
    'reason_four': 'Reason Four'
}

我喜欢这个,因为我的同事只需更改该列表并运行 notebook 即可让一切正常运行。例如,他可能会添加一个新的原因;或编辑给定原因代码的列名称以使其更清晰。

我的想法是创建一个接受字典和列的函数,遍历字典键,将 0 或 1 附加到空列表,然后使用该列表创建一个新列。

我走到这一步:

def breakout_columns (errors, column):
    
    column_values = []
    
    for key in errors:
        
        if key in column:
            value = 1
        else:
            value = 0
        
        column_values.append(value)
    
        print(column_values)

当我运行它时,它确实产生了一个包含 10 个值的列表,但是即使其中一些应该为真,它们都是 0。我一直在寻找有关遍历数据帧行的资源,但我没有像我正在尝试做的那样远程看到任何东西。

除了这件作品不起作用之外,我担心我的方法存在固有缺陷,或者(a)我应该做一些完全不同的事情来尝试清理东西;或者 (b) 我尝试做的事情不可能或没有意义,所以我只需要坚持使用 10 个函数和 10 个 lambda。

任何指导将不胜感激!

【问题讨论】:

    标签: python pandas lambda jupyter-notebook


    【解决方案1】:

    您可以遍历 error_list 并通过将给定的列与您的 reasons 进行比较来创建新系列(如果您想要 0 或 1 而不是 False 和 True,则转换为 int):

    import pandas as pd
    
    error_list = {
        "reason_one": "Reason One",
        "reason_two": "Reason Two",
        "reason_three": "Reason Three",
        "reason_four": "Reason Four",
    }
    
    df = pd.DataFrame(
        {
            "Labels": [
                "reason_two",
                "reason_two",
                "reason_one",
                "cat",
                "reason_four",
                "many",
                "sandwich",
            ]
        }
    )
    
    for reason, column_name in error_list.items():
        df[column_name] = (df["Labels"] == reason).astype(int)
    
    print(df)
    

    打印出来

            Labels  Reason One  Reason Two  Reason Three  Reason Four
    0   reason_two           0           1             0            0
    1   reason_two           0           1             0            0
    2   reason_one           1           0             0            0
    3          cat           0           0             0            0
    4  reason_four           0           0             0            1
    5         many           0           0             0            0
    6     sandwich           0           0             0            0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      • 1970-01-01
      • 2020-02-27
      • 2017-05-09
      • 2018-07-17
      相关资源
      最近更新 更多