2015-04-26 29 views
1

我有一個包含整數列的數據框。我想編寫一個將一系列作爲參數的函數,遍歷該系列中的每個值,並對該系列中的每個整數執行case語句,並從case語句的結果中返回一個新的序列。目前,我用下面的代碼,並得到錯誤的工作:Pandas函數用case語句迭代系列值

def function(series): 
    if series['column_of_ints'] >= 0 and series['column_of_ints'] < 100: 
     return series['column_of_ints'] 
    elif series['column_of_ints'] >= 100 and series['column_of_ints'] < 200: 
     return series['column_of_ints'] + 1 
    else: 
     return series['column_of_ints'] + 2 

df['column_of_ints_v2'] = df['column_of_ints'].apply(function, axis=1) 
+0

什麼是錯誤日誌?我想你只能在函數(系列)中用'series'來替換'series ['column_of_ints']',你將一個系列傳遞給函數而不是數據框。 – Zero

+0

錯誤是無效的標量變量索引 - 可能由EdChum尋址 –

回答

1

不要使用apply可以實現用3 .loc調用快得多相同的結果:

df.loc[(df['column_of_ints'] >= 0) & (df['column_of_ints'] < 100), 'column_of_ints_v2'] df['column_of_ints'] 

df.loc[(df['column_of_ints'] >= 100) & (df['column_of_ints'] < 200), 'column_of_ints_v2'] = df['column_of_ints'] + 1 

df.loc[(df['column_of_ints'] < 0) & (df['column_of_ints'] >= 200), 'column_of_ints_v2'] = df['column_of_ints'] + 2 

或者使用where

df['column_of_ints_v2'] = np.where((df['column_of_ints'] >= 0) & (df['column_of_ints') < 100), df['column_of_ints'] + 1, np.where((df['column_of_ints'] >= 100) & (df['column_of_ints'] < 200), df['column_of_ints'] + 2, df['column_of_ints'])) 

至於爲什麼你的代碼失敗:

df['column_of_ints'].apply(function, axis=1) 

DF [「column_of_ints」]是一個系列不是一個數據幀,沒有axis=1apply方法的系列,你可以使用雙括號迫使這一個數據幀:

df[['column_of_ints']].apply(function, axis=1) 

如果」重新申請行明智的一列,那麼你不需要在你的函數列存取:

def function(series): 
    if series >= 0 and series < 100: 
     return series 
    elif series >= 100 and series < 200: 
     return series + 1 
    else: 
     return series + 2 

但實際上你應該使用一個向量化方法,像我的建議上面

+0

如果我想用相同的信息覆蓋column_of_ints,此策略是否工作?例如:df.loc [(df ['column_of_ints']> = 0)&(df ['column_of_ints'] <100),'column_of_ints'] df ['column_of_ints'] –

+0

是的,您可以使用3 'loc'調用來處理每個布爾條件來過濾df,或者一個'where' cal有一個嵌套'where'來處理這三個條件 – EdChum