熊猫系列的value_counts对于不同的计数工作方式不同

时间:2018-11-14 06:22:36

标签: python pandas numpy

例如:

df1 = pd.DataFrame(np.repeat(np.arange(1,7),3), columns=['A'])

df1.A.value_counts(sort=False)
1    3
2    3
3    3
4    3
5    3
6    3
Name: A, dtype: int64

df2 = pd.DataFrame(np.repeat(np.arange(1,7),100), columns=['A'])

df2.A.value_counts(sort=False)
1    100
2    100
3    100
4    100
5    100
6    100
Name: A, dtype: int64

在以上示例中,value_counts可以完美运行并给出所需的结果。而当涉及到较大的数据帧时,它将给出不同的输出。这里的A值已经排序,计数也相同,但是A的索引顺序在value_counts之后改变了。为什么小数目却正确,大数目却不正确:

df3 = pd.DataFrame(np.repeat(np.arange(1,7),1000), columns=['A'])

df3.A.value_counts(sort=False)
4    1000
1    1000
5    1000
2    1000
6    1000
3    1000
Name: A, dtype: int64

在这里我可以做df3.A.value_counts(sort=False).sort_index()df3.A.value_counts(sort=False).reindex(df.A.unique())。我想知道为什么它在不同计数方面表现不同的原因吗?

使用:

Numpy version :1.15.2
Pandas version :0.23.4

1 个答案:

答案 0 :(得分:2)

这实际上是一个已知问题。

如果您浏览源代码-

  1. C:\ProgramData\Anaconda3\Lib\site-packages\pandas\core\algorithims.py581行是原始实现
  2. _value_counts_arraylike时,它会为int64的值调用bins=None
  3. 此函数进行呼叫-keys, counts = htable.value_count_int64(values, dropna)

如果再看一下htable的实现,您将得出以下结论:键是任意顺序的,这取决于hashtable的工作方式。

它不保证任何形式的订购。通常,此例程按最大值排序,而这几乎总是您想要的。

我想他们可以将其更改为具有sort=False的原始顺序。我不知道这是否真的会破坏任何东西(并且在内部完成这并不是很昂贵,因为已经知道了唯一性)。

订单已从pandas/hashtable.pyx.build_count_table_object() 更改。调整pymap的大小会通过散列值来移动条目。

这是full讨论