2016-04-26 4 views
1

私は以下のメンバーのサインイン日付と契約の長さを取り、各メンバーの有効期限付きの変更されたデータフレームを返すという機能を持っています。この関数は意図したとおりに機能しますが、入れ子関数month_to_num(ind)をより洗練された方法で書くことができるかどうかを知りたかったのです。私は、Pythonはcasesを実装していない知っているが、すべてのif/elif/elseステートメントを書き換える方法はありますか?Pythonのスイッチケースのような構造

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 
+1

通常は、 'case'文や大きな' if/elif'ブロックを置き換えるためにPython辞書を使用することができます。 –

答えて

1

これはCode Review Stack Exchangeに適しているが、機能を維持するために、あなたは普通の辞書を使用したい:コードのにおいのビットは、ここではどのようにではあります、

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) 

言いましたこの方法で文字列を数値にマッピングします。

+0

ありがとう、私はその場所が存在しなかった – Lukasz

1

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 
関連する問題