2016-10-23 33 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