我有一个数据框,其中包含一列type
的分类数据,并且我有一个表(字典)用于每种可能的 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
(我天真地试图将Series作为键,这是行不通的。)
我想我可以为参数值添加新列,但是以某种方式看起来并不优雅,而且我相信有更好的方法。最好的方法是什么?
编辑:我刚刚意识到我可以通过以下方式获得包含参数列表的列
df.type.map(parameters)
但是我无法访问这些列表的条目,因为通常的索引约定似乎不起作用。例如。 df.type.map(parameters).loc[:,2]
给出IndexingError: Too many indexers
;基本上,当尺寸过大而没有将其全部粘贴在MultiIndex中时,大熊猫会感到困惑。有办法解决这个问题吗?
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
答案 0 :(得分:1)
对于矢量化解决方案,应将Route::get("/home/{lang?}", function ($lang = null) {
App::setlocale($lang);
$radars2 = Radar::all();
return view('/home', ['radars2' => $radars2]);
});
给出的一系列列表划分为单独的列。然后,您可以利用有效的NumPy操作:
df['type'].map(parameters)
您注意到,params = pd.DataFrame(df['type'].map(parameters).values.tolist(),
columns=['a', 'b'])
df['new'] = params['a'] * df['A'] + params['b']
是一个薄薄的,通常效率低下的循环。应尽可能避免。