我正在寻找一种计算数据透视表和频率计数的有效方法,但我的要求是,如果我知道变量的域,那么应该计算域中每个值的计数,而不仅仅是观察到的那些值在样本中。
例如使用下面的代码,Series.count_values 方法输出:
2 2
1 2
但我知道我的变量的域是 [0,1,2] 所以我真的想要:
0 0
1 2
2 2
下面是重现示例的代码示例
import pandas as pd
import numpy as np
s=pd.Series([1,2,2,1])
def my_value_counts(s,levels):
#levels is a numpy array
c=s.value_counts()
foundl=sorted(c.index)
counts=np.zeros_like(levels)
for i,l in enumerate(levels):
if l in foundl:
counts[i]=c.loc[l]
return counts
print "Original method"
print s.value_counts()
print "with all levels"
print my_value_counts(s,np.arange(3))
我的问题是:我的代码效率低吗?似乎有点排序可能会有所帮助。如果是这样,有没有一种方法可以做到这一点,而不必像我在代码中那样重新创建频率表并将其值与 values_count 的输出匹配?
谢谢, 铝
最佳答案
一种方法是使用从 0 到最大值 + 1 的新索引重新索引
value_counts:
In [12]:
s=pd.Series([1,2,2,1])
val = s.value_counts()
val.reindex(np.arange(0, s.max()+1)).fillna(0)
Out[12]:
0 0
1 2
2 2
dtype: float64
关于python - 具有已知变量水平的 count_values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37215870/