gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:09:52 27 4
gpt4 key购买 nike

我有一个包含分类数据列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'对象是可变的,因此它们无法被散列(我天真地尝试使用Series作为键,但这不起作用)。

我想我可以为参数值创建新列,但这似乎不太优雅,而且我确信有更好的方法。最好的方法是什么?

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

df.type.map(parameters)

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

EDIT2:一个最小的例子:

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 是一个薄薄的、通常效率低下的循环。应尽可能避免。

关于python - 应用其参数取决于列值的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51743014/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com