应用其参数取决于列值的函数



>我有一个数据帧,其中包含分类数据的列type,并且我有一个每种可能类型的参数值表(字典(,其每个条目看起来像

type1: [x1,x2,x3]

我的工作代码看起来像这样:

def foo(df):
[x1,x2,x3] = parameters[df.type]
return (* formula depending on x1,x2,x3,df.A,df.B *)
df['new_variable'] = df.apply(lambda x: foo(x), axis = 1)

像这样(.apply(..., axis=1)(遍历行当然非常慢,我想要一个有效的解决方案,但我不知道如何以整洁的方式进行表查找。例如,我不能只做

df['new_variable'] = (* formula depending on parameters[df.type][0:3],df.A,df.B *)

因为这会引发TypeError: 'Series' objects are mutable, thus they cannot be hashed(我天真地尝试使用系列作为键,这不起作用(。

我想我可以为参数值制作新列,但这似乎不优雅,我相信有更好的方法。最好的方法是什么?

编辑:我刚刚意识到我可以通过以下方法获得包含参数列表的列

df.type.map(parameters)

但我无法访问这些列表的条目,因为通常的索引约定似乎不起作用。 例如df.type.map(parameters).loc[:,2]给出了一个IndexingError: Too many indexers;基本上,当有太多维度而没有将其全部粘贴在MultiIndex中时,熊猫会感到困惑。有没有办法解决这个问题?

编辑2:一个最小的例子:

df = pd.DataFrame([['dog',4],['dog',6],['cat',1],['cat',4]],columns = ['type','A'])
parameters = {'dog': [1,2], 'cat': [3,-1]}
def foo(x):
[a,b]=parameters[x.type]
return a * x.A + b
df['new'] = df.apply(foo,axis=1)

产生所需的输出

type  A  new
0  dog  4    6
1  dog  6    8
2  cat  1    2
3  cat  4   11

对于矢量化解决方案,您应该将一系列列表(这是df['type'].map(parameters)给出的(拆分为单独的列。然后,您可以利用高效的 NumPy 操作:

params = pd.DataFrame(df['type'].map(parameters).values.tolist(),
columns=['a', 'b'])
df['new'] = params['a'] * df['A'] + params['b']

正如您所注意到的,pd.DataFrame.apply是一个薄薄的、通常效率低下的循环。应尽可能避免使用。

最新更新