Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas-标识每列中唯一项的百分比_Python_Pandas - Fatal编程技术网

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())