2015-05-15 13 views
0

我已輸入參數通過如下參數字典通過 -「功能」&一個「爲」在大熊貓邏輯

paramDict = { "Period": 
        { 
        "Description": "A Period", 
        "Value" : ['9'] 
        }, 
       "AdditionalPeriods": 
         { 
         "Description": "An AdditionalPeriod", 
         "Value" : ['1'] 
         } 
      } 

而且,我有一個數據幀「df_AssetCst」,如下 -

>>> df_AssetCst.dtypes 
FLCO    object 
FLN01    object 
FLN02    object 
FLN03    object 
FLN04    object 
FLN05    object 
FLN06    object 
FLN07    object 
FLN08    object 
FLN09    object 
FLN10    object 
FLN11    object 
FLN12    object 
FLN13    object 
FLN14    object 

現在基於傳遞給參數字典的價值,我要實現以下「的if-else」條件蟒蛇大熊貓 -

def func(row): 
    if pd.Series(paramDict['AdditionalPeriods']['Value'][0]) == '0': 
     return '0'   
    elif pd.Series(paramDict['AdditionalPeriods']['Value'][0]) == '1': 
     return df_AssetCst['FLN13'] 
    elif pd.Series(paramDict['AdditionalPeriods']['Value'][0]) == '2': 
     return (df_AssetCst['FLN13'].astype(int) 
       + df_AssetCst['FLN14'].astype(int)) 
    else: 
     return 'other' 

在SQL中,上述情況下的邏輯是如下 -

Case AdditionalPeriods = 0, Then NewColumn = 0 
Case AdditionalPeriods = 1, Then NewColumn = FLN013 
Case AdditionalPeriods = 2, Then NewColumn = FLN013 + FLN014 

現在,我想用函數來創建在數據幀的新列 -

df_AssetCst['NewColumn'] = df_AssetCst.apply(func, axis=1) 

但是,這給了我下面無差錯

ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', u'occurred at index 0') 

在此之後,我想實現下面的 「爲」 邏輯 -

if Period.value = '9' 
then NewColumn2 = FLN01+FLN02+FLN03+FLN04+FLN05+FLN06+FLN07+FLN08+FLN09 

能否請您幫助我做一些方向&達到same.Thanks的最佳途徑

**********我的解決方案***********

#1. Function logic : 
def func(row): 
    if paramDict['AdditionalPeriods']['Value'][0] == '0': 
     var = 0  
    elif paramDict['AdditionalPeriods']['Value'][0] == '1': 
     var = int(row['FLN13']) 
    elif paramDict['AdditionalPeriods']['Value'][0] == '2': 
     var = int(row['FLN13']) + int(row['FLN14'])         
    else: 
     var = -1 

    return(var) 

#2. For logic 
In_Period = paramDict['Period']['Value'][0] 
colList = ['FLN{:0>2}'.format(X) for X in range(1, In_Period + 1)] 
df_AssetCst['NewColumn1'] = df_AssetCst[colList].astype(int).sum(axis=1) 
+0

'ValueError:('一個Series的真值是不明確的......'在測試np.ndarray和一個標量之間的條件時出現,用'np.all()'或''np.any()'實際上''pd.Series'可能在'func'中被濫用,需要更多的信息,但我認爲'apply()'使用不正確,因爲'row'參數,'pd .Series',從來沒有用在'func()'中。[pandas](http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.apply.html):**「Objects傳遞給函數的是索引是DataFrame的索引(axis = 0)或列(axis = 1)的Series對象。「** –

+0

@MarkMikofski - 增加了上面爲我工作的解決方案。 – 0nir

回答

1

隨着func函數你寫在你更新的答案(即您的解決方案),您應該可以使用參數axis=1DataFrame.apply方法。 (我還沒有測試過,但也許你可以嘗試應用它並報告錯誤信息,如果有的話)

但是,在這個函數中,你指的是全局範圍內的param_dict,它雖然有效,如果你不小心可能會導致意想不到的後果,國際海事組織可能會導致更多的頭痛。

這裏的func功能的另一個版本。這一個作爲參數類型pd.Series的行,(你在問題中所提供的字典)一param_dict

def func(row, param_dict): 
    """ 
    Gets the key from the param_dict, and tries to return the element 
    from _conversion_map. 
    if the key doesn't exist in the conversion map, then returns -1 
    """ 
    key = param_dict['AdditionalPeriods']['Value'][0] 
    _conversion_map = { 
     '0': 0, 
     '1': int(row.FLN13), 
     '2': int(row.FLN13) + int(row.FLN14) 
     } 
    try: 
     return _conversion_map[key] 
    except KeyError: 
     return -1 

那麼這應該工作:

df_AssetCst['NewColumn'] = df_AssetCst.apply(func, axis=1, param_dict=param_dict) 

這個答案的關鍵是apply方法接受任意位置&關鍵字參數並將它們傳遞給該函數。