2014-02-24 91 views
2

說我有一個數據框。我想知道,對於每一列,關於數據幀的總大小(一個百分比),我有多少個唯一條目。熊貓 - 確定每列唯一條目的百分比

換句話說,我想了解每列有多少「熵」。

我想下面會做它:

my_f = lambda x: x.unique()/len(x) 
df.apply(my_fl) 

,但我得到:

ValueError: Shape of passed values is (35,), indices imply (35, 125) 

apply叫我的lambda函數,一次爲每個列?

回答

3

我相信你需要:

my_f = lambda x: 1.0*len(x.unique())/len(x) 

平原x.unique()將是唯一元素的數組。因此,x.unique()/len(x)將按照元素的方式將所有這些元素乘以1.0/len(x),並根據每個組的唯一條目數量返回可變長度數組。

注意len(x)產生的整數,而x.unique()產生陣列和該陣列的元件將具有它們發生任何類型具有如x條目。所以它不一定是x.unique()/len(x)完全定義好的情況。即使它在技術上定義,它也可能會給你意想不到的輸出。

例如,如果的x的其中一個條目是整數4並且如果len(x)是整數5,然後在對應於獨特值4實際上將0表達x.unique()/len(x)的輸出處的條目(!)由於到Python中的整數除法的細節。

因此,即使在糾正計算唯一數組的錯誤而不是唯一數組長度的錯誤之後,您仍然必須小心:len(x.unique())/len(x)也會導致整數被另一個整數除,並且大部分時間分子將小於分子,產生0

考慮下面的玩具例子:

In [264]: dfrm 
Out[264]: 
      A   B   C D E 
0 -0.505698 -0.871505 -0.463435 a a 
1 0.879227 -1.010891 -0.007801 b a 
2 1.119962 0.252159 -1.189837 c a 
3 -0.172311 -0.403126 0.270885 d a 
4 1.395133 0.453722 0.232463 e a 
5 0.521169 1.293135 -0.877195 f b 
6 1.344043 0.066453 -1.015383 g b 
7 -0.952602 1.530535 -0.832182 h b 
8 0.557599 1.280014 0.329418 i b 
9 -2.699605 0.934329 0.466991 j b 

In [265]: dfrm.A.unique() 
Out[265]: 
array([-0.50569806, 0.87922668, 1.11996225, -0.17231083, 1.39513253, 
     0.52116909, 1.34404271, -0.95260174, 0.55759942, -2.69960545]) 

In [266]: dfrm.A.unique()/len(dfrm.A) 
Out[266]: 
array([-0.05056981, 0.08792267, 0.11199622, -0.01723108, 0.13951325, 
     0.05211691, 0.13440427, -0.09526017, 0.05575994, -0.26996054]) 

In [267]: dfrm.E.unique()/len(dfrm.E) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-267-96b4a1138673> in <module>() 
----> 1 dfrm.E.unique()/len(dfrm.E) 

TypeError: unsupported operand type(s) for /: 'str' and 'int' 

In [268]: len(dfrm.A.unique())/len(dfrm.A) 
Out[268]: 1 

In [269]: len(dfrm.E.unique())/len(dfrm.E) 
Out[269]: 0 

In [270]: 

In [270]: 1.0*len(dfrm.E.unique())/len(dfrm.E) 
Out[270]: 0.2 
+1

小:你可以用'x.nunique()',而不是'LEN(x.unique())'。 – DSM

+0

這是一個偉大的觀點! – ely