例如:
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
答案 0 :(得分:2)
这实际上是一个已知问题。
如果您浏览源代码-
C:\ProgramData\Anaconda3\Lib\site-packages\pandas\core\algorithims.py
第581
行是原始实现_value_counts_arraylike
时,它会为int64
的值调用bins=None
keys, counts = htable.value_count_int64(values, dropna)
如果再看一下htable
的实现,您将得出以下结论:键是任意顺序的,这取决于hashtable
的工作方式。
它不保证任何形式的订购。通常,此例程按最大值排序,而这几乎总是您想要的。
我想他们可以将其更改为具有sort=False
的原始顺序。我不知道这是否真的会破坏任何东西(并且在内部完成这并不是很昂贵,因为已经知道了唯一性)。
订单已从pandas/hashtable.pyx.build_count_table_object()
更改。调整pymap
的大小会通过散列值来移动条目。
这是full讨论