【问题标题】:Switch-case like structure in python [duplicate]python中的类似开关的结构[重复]
【发布时间】:2016-08-20 20:25:35
【问题描述】:

我创建了以下函数,该函数获取成员的登录日期和合同期限,并返回一个修改后的数据框,其中包含每个成员的到期日期。该函数按预期工作,但我想知道是否有更简洁的方法来编写嵌套函数month_to_num(ind)。我知道python没有实现cases,但是有没有办法重写所有if/elif/else语句?

def renewal_date(df):

    def month_to_num(ind):
        if (df.loc[ind, "Contract Type"] == "1 Month"):
            return 1
        elif (df.loc[ind, "Contract Type"] == "3 Months Prom" or 
              df.loc[ind, "Contract Type"] == "3 Month"):
            return 3
        elif (df.loc[ind, "Contract Type"] == "4 Month Promo"):
            return 4
        elif (df.loc[ind, "Contract Type"] == "6 Months"):
            return 6
        else:
            return 12

    for z in range(0, len(df)): 
        exp_date = (df.loc[z, "Date-Joined"] + 
                    relativedelta(months=+month_to_num(z)))
        df.set_value(z,"Date-Renewal", exp_date)

    return df

【问题讨论】:

  • 您通常可以使用 python 字典来替换 case 语句或大的 if/elif 块。

标签: python pandas


【解决方案1】:

这更适合于987654321 @,但要保留功能,您通常使用字典:

MONTH_NUMS = {
    '1 Month': 1,
    '3 Months Prom': 3,
    '3 Month': 3,
    '4 Month Promo': 4,
    '6 Months': 6,
}

def month_to_num(ind):
    return MONTH_NUMS.get(df.loc[ind, 'Contract Type'], 12)
所说,这里有一点代码在我们如何将字符串映射到数字的方式。

【讨论】:

  • 谢谢,我没有意识到那个存在 span>
【解决方案2】:

您可以将字典与 dict.get() 方法配合使用,如果字典中不存在键,则返回默认值。

def renewal_date(df):
    def month_to_num(ind):
        contract_types = {'1 Month': 1, '3 Months Prom': 3, '4 Month Promo': 4, '6 Months': 6}

        return contract_types.get(df.loc[ind, "Contract Type"], 12)

    for z in range(0, len(df)):
        exp_date = (df.loc[z, "Date-Joined"] +
                    relativedelta(months=+month_to_num(z)))
        df.set_value(z, "Date-Renewal", exp_date)

    return df

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多