这是我的尝试。
Dataframe我现在有一个专栏来决定如何处理这些功能。
例如,df
有两列,DATA
和TYPE
。 TYPE
有三个类:S1
,S2
和S3
。我将根据不同类型的样本定义三种不同的功能。
#### 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
不起作用。
任何建议都会受到赞赏!
答案 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
或者,您可以按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))