说我有一个数据帧。我想知道,对于每一列,我有多少与数据帧总大小相关的唯一条目(百分比)。
换句话说,我想了解每列有多少“熵”。
我认为以下情况会这样做:
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函数,每列一次?
答案 0 :(得分: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()
生成一个数组,该数组的元素将具有它们碰巧在{{1 }}。因此,x
根本没有明确定义的情况。即使它是技术定义的,也可能会给你意想不到的输出。
例如,如果x.unique()/len(x)
中的一个条目是整数x
并且4
是整数len(x)
,那么表达式输出中的条目由于Python中整数除法的细节,对应于唯一值5
的{{1}}实际上将是x.unique()/len(x)
(!)。
因此,即使在纠正计算唯一数组的错误而不是唯一数组的长度之后,您仍然必须小心:4
也会导致整数除以另一个整数,并且大多数分子小于分母的时间,产生0
。
考虑以下玩具示例:
len(x.unique())/len(x)