我相信你需要:
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
來源
2014-02-24 16:52:13
ely
小:你可以用'x.nunique()',而不是'LEN(x.unique())'。 – DSM
這是一個偉大的觀點! – ely