Python lambda元组映射
试图计算一个范围(置信区间),以返回在列上映射的lambda中的两个值Python lambda元组映射,python,pandas,Python,Pandas,试图计算一个范围(置信区间),以返回在列上映射的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'
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)
通过为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))
您可以从操作员
从这里开始,它只是一个班轮:
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],轴=1)
基本上,很难从
dt.apply
看出输出应该是什么样子,只是看到一些元组。通过单独应用,我们得到了两个10 x 1数组。T
在您的示例中没有定义,第4+5行也会抛出错误(dt['vc']
,索引)。很抱歉,T只是T统计。。(这只是一个玩具示例,真正的问题是将一个元组输出/输入到lambda/mapda。再次表示歉意,我从我的真实示例(我正在为一组列传递变量名等)中简化了它。)…我添加了引号并为T创建了一个值…此外,问题中发布的lambda实际上没有返回元组,因此没有任何东西可以打开。我认为像Tom那样透明清晰地拆分它是一种方式。谢谢!我花了一点时间去看牛!我不会想到的!谢谢!