2016-10-23 63 views
0

這是我的嘗試。用熊貓中的特定字符串映射函數

我現在有了一個Dataframe專欄,它將決定如何處理這些功能。

例如,df有兩欄,DATATYPETYPE有三類:S1,S2S3。我將根據不同類型的樣本定義三種不同的功能。

#### S1 
def f_s1(data): 
    result = data+1 
    return result 

#### S2 
def f_s2(data): 
    result = data+2 
    return result 

#### S3 
def f_s3(data): 
    result = data+3 
    return result 

我還創建了一個映射集:

f_map= {'S1':f_s1,'S2':f_s2, 'S3': f_s3} 

然後,我使用pandas.Map效用這些功能與每個樣品的類型映射。

df['result'] = df['TYPE'].map(f_map)(df['DATA']) 

但它沒有與TypeError: 'Series' object is not callable一起使用。

任何意見將不勝感激!

回答

1

df['TYPE'].map(f_map)創建一系列的功能,如果你想將它們相應地適用於您的數據列,其中一個方案是使用zip()功能如下:

df['result'] = [func(data) for func, data in zip(df['TYPE'].map(f_map), df['DATA'])] 
df 

enter image description here

另外,您可以按TYPE進行分組,然後將各個類型(或組)的特定功能應用於該組中的DATA列,假設您的預定義功能包含矢量化操作並因此接受序列作爲參數:

df = pd.DataFrame({'TYPE':['S1', 'S2', 'S3', 'S1'], 'DATA':[1, 1, 1, 1]}) 

df['result'] = (df.groupby('TYPE').apply(lambda g: f_map.get(g['TYPE'].iloc[0])(g['DATA'])) 
        .reset_index(level = 0, drop = True)) 

enter image description here