pandas lambda 元组映射
我想计算一个范围(置信区间),然后在一列上用 lambda 函数返回两个值。
M=12.4; n=10; T=1.3
dt = pd.DataFrame( { 'vc' : np.random.randn(10) } )
ci = lambda c : M + np.asarray( -c*T/np.sqrt(n) , c*T/np.sqrt(n) )
dt['ci'] = dt['vc'].map( ci )
print '\n confidence interval ', dt['ci'][:,1]
那么,这个怎么做呢?
接下来,如何在 lambda 函数中拆解元组呢? (我想检查这个范围是否大于0,也就是是否包含平均值)
以下两种方法都不行:appnd = lambda c2: c2[0]*c2[1] > 0 and 1 or 0
app2 = lambda x,y: x*y >0 and 1 or 0
dt[cnt] = dt['ci'].map(app2)
1 个回答
3
可能通过定义一个合适的函数来处理置信区间(CI)会更简单,而不是用一个lambda
表达式。
关于解包的部分,你可以让这个函数接受一个参数,用来决定是加还是减,然后再应用两次。
你还应该在函数内部计算平均值和大小,而不是提前就给它们赋值。
In [40]: def ci(arr, op, t=2.0):
M = arr.mean()
n = len(arr)
rhs = arr * t / np.sqrt(n)
return np.array(op(M, rhs))
你可以从operator
模块导入add
和sub
这两个函数。
接下来就只需要一行代码:
In [47]: pd.concat([dt.apply(ci, axis=1, op=x) for x in [sub, add]], axis=1)
Out[47]:
vc vc
0 -0.374189 1.122568
1 0.217528 -0.652584
2 -0.636278 1.908835
3 -1.132730 3.398191
4 0.945839 -2.837518
5 -0.053275 0.159826
6 -0.031626 0.094879
7 0.931007 -2.793022
8 -1.016031 3.048093
9 0.051007 -0.153022
[10 rows x 2 columns]
我建议把这个过程分成几个步骤,这样更清晰。首先用r1 = dt.apply(ci, axis=1, op=sub)
来得到减去一的结果,然后用r2 = dt.apply(ci, axis=1, op=add)
来得到加上的结果。最后用pd.concat([r1, r2], axis=1)
把它们合并在一起。
基本上,从dt.apply
中很难看出输出应该是什么样子,只能看到一些元组。通过分别应用,我们得到了两个10 x 1的数组。