作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含分类数据列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/
我是一名优秀的程序员,十分优秀!