pandas lambda 元组映射

1 投票
1 回答
1231 浏览
提问于 2025-04-18 06:27

我想计算一个范围(置信区间),然后在一列上用 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模块导入addsub这两个函数。

接下来就只需要一行代码:

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的数组。

撰写回答