使用Pandas中的特定字符串映射函数

时间:2016-10-23 03:23:25

标签: python python-2.7 pandas

这是我的尝试。

Dataframe我现在有一个专栏来决定如何处理这些功能。

例如,df有两列,DATATYPETYPE有三个类:S1S2S3。我将根据不同类型的样本定义三种不同的功能。

#### 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 个答案:

答案 0 :(得分: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