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

时间:2018-08-08 09:22:11

标签: python performance pandas dataframe

我有一个数据框,其中包含一列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

1 个答案:

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