2014-05-13 83 views
1

嘗試計算範圍(置信區間)以返回在列上映射的lambda中的兩個值。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'][:,1] 

..er,那麼這是如何完成的?

那麼,如何在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) 
+0

在您的示例中未定義'T',並且第4 +5行也會引發錯誤('dt ['vc']',Indexing)。 – ojdo

+0

對不起,T只是t-statistic ..(它只是一個玩具的例子,真正的問題是得到一個元組/ out到lambda/map – syntax

+0

再次我的道歉,我簡化它從我的真實例子(我在哪裏通過)...我添加了引號併爲T創建了一個值... – syntax

回答

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×1陣列。

+0

此外,問題中發佈的lambda實際上並不返回元組,所以沒有任何可解開的東西。認爲透明度和清晰度,像湯姆展示的那樣分解它是一種方式, – cwharland

+0

謝謝!帶了我一點點時間去看牛!不會想到這個!謝謝! – syntax