【问题标题】:Convert a sequential conditions script into a general process将顺序条件脚本转换为一般流程
【发布时间】:2020-12-07 10:38:22
【问题描述】:

我目前正在对具有多种条件的顺序管道进行泛化; 假设我有一个水果数据,描述了苹果、香蕉和梨以及它们对应的重量和颜色。

import pandas as pd
fruits = pd.DataFrame({'Fruit': ['Apple', 'Apple', 'Banana', 'Pear' 'Pear', 'Banana'],
                      'Weight': [42, 64, 82, 74, 51, 71],
                      'Color': ['Red', 'Green', 'Yellow', 'Green' 'Red', 'Yellow']})

我想使用全部或部分特征将水果分为“Red_big_apples”、“Green_big_apples”、“Red_small_apples”、“Green_small_apples”、“Red_big_pears”等组。

for i in list(fruits.index):
    if fruits.loc[i, 'Fruit'] == 'Apple':
        if fruits.loc[i, 'Weight'] < 50:
            if fruits.loc[i, 'Color'] == 'Red':
                fruits.loc[i, 'Group'] = 'Red_small_apples'
ect.

现在想象一下,我有一个更复杂的顺序条件管道,并且可能需要在几周内实现一个全新的、不同的复杂顺序条件管道。

主要思想是创建一个组合 df/hashmap,它将与类中的某个函数(我将创建)进行通信,以提取给定水果的最后一组 - 但是当我构建 df/hashmap(一个复杂的任务本身)时,我知道它会有多大(约 2000 行/组合)。

我的问题是,您认为解决此问题的最佳方法是什么?

如果发生内部更改或新管道,分组方式将是:

  1. 计算速度最快
  2. 最容易实施

哪种方式最通用,因此在这种情况下我不需要更改类和/或类函数?

  1. df/hashmap
  2. 具体功能
  3. 其他

谢谢!

【问题讨论】:

    标签: python oop hashmap


    【解决方案1】:

    您所描述的可以使用 apply 来实现,如下所示:

    def classify(x):
        if x.Weight > 50:
            return f"{x.Color}_big_{x.Fruit}"
        else:
            return f"{x.Color}_small_{x.Fruit}"
    
    fruits['class'] = fruits.apply(classify, axis=1)
    

    这会生成:

    Fruit   Weight  Color   class
    0   Apple   42  Red Red_small_Apple
    1   Apple   64  Green   Green_big_Apple
    2   Banana  82  Yellow  Yellow_big_Banana
    3   Pear    74  Green   Green_big_Pear
    4   Pear    51  Red Red_big_Pear
    5   Banana  71  Yellow  Yellow_big_Banana
    

    通过修改classify函数可以进一步实现更复杂的条件。

    【讨论】:

    • 我知道我给出的例子很简单,但是想象一个复杂的管道,有更多的步骤、分类和内部依赖,而不同的类有不同的条件。
    • 是否可以通过编程方式生成这些规则?如果没有,您将不得不列举这些规则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2016-09-09
    • 1970-01-01
    相关资源
    最近更新 更多