Python Pandas-标识每列中唯一项的百分比
假设我有一个数据帧。我想知道,对于每一列,相对于数据帧的总大小(百分比),我有多少个唯一的条目 换句话说,我想知道每列有多少“熵” 我认为以下几点可以做到:Python Pandas-标识每列中唯一项的百分比,python,pandas,Python,Pandas,假设我有一个数据帧。我想知道,对于每一列,相对于数据帧的总大小(百分比),我有多少个唯一的条目 换句话说,我想知道每列有多少“熵” 我认为以下几点可以做到: my_f = lambda x: x.unique()/len(x) df.apply(my_fl) 但我得到: ValueError: Shape of passed values is (35,), indices imply (35, 125) 是否应用调用我的lambda函数,每列一次 我相信您需要: my_f = lambd
my_f = lambda x: x.unique()/len(x)
df.apply(my_fl)
但我得到:
ValueError: Shape of passed values is (35,), indices imply (35, 125)
是否应用
调用我的lambda函数,每列一次 我相信您需要:
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
,那么表达式x.unique()/len(x)
输出中与唯一值4
对应的条目实际上将是0
(!)由于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
[264]中的:dfrm
Out[264]:
A、B、C、D、E
0-0.505698-0.871505-0.463435 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华氏度
6 1.344043 0.066453-1.015383克体重
7-0.952602 1.530535-0.832182华氏度
8 0.557599 1.280014 0.329418仪表板
9-2.699605 0.934329 0.466991 j b
在[265]中:dfrm.A.unique()
出[265]:
阵列([-0.50569806,0.87922668,1.11996225,-0.17231083,1.39513253,
0.52116909, 1.34404271, -0.95260174, 0.55759942, -2.69960545])
在[266]中:dfrm.A.unique()/len(dfrm.A)
出[266]:
阵列([-0.05056981、0.08792267、0.11199622、-0.01723108、0.13951325、,
0.05211691, 0.13440427, -0.09526017, 0.05575994, -0.26996054])
[267]中的dfrm.E.unique()/len(dfrm.E)
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1 dfrm.E.unique()/len(dfrm.E)
TypeError:/:“str”和“int”的操作数类型不受支持
在[268]中:len(dfrm.A.unique())/len(dfrm.A)
Out[268]:1
在[269]中:len(dfrm.E.unique())/len(dfrm.E)
Out[269]:0
在[270]中:
在[270]中:1.0*len(dfrm.E.unique())/len(dfrm.E)
Out[270]:0.2
Minor:您可以使用x.nunique()
代替len(x.unique())
。