Python 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'

试图计算一个范围(置信区间),以返回在列上映射的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)

通过为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那样透明清晰地拆分它是一种方式。谢谢!我花了一点时间去看牛!我不会想到的!谢谢!