例如:
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
这实际上是一个已知的问题。
如果你浏览源代码-
C:ProgramDataAnaconda3Libsite-packagespandascorealgorithims.py
行581
是原始实现- 当
bins=None
时,它为int64
值调用_value_counts_arraylike
- 此函数调用-
keys, counts = htable.value_count_int64(values, dropna)
如果您查看htable
实现,您会得出结论,密钥的顺序是任意的,这取决于hashtable
的工作方式。
它不能保证任何形式的订购。通常,这个例程按最大值进行排序,这几乎总是你想要的。
我想他们可以将其更改为sort=False
平均原始排序。我不知道这是否真的会破坏任何东西(正如众所周知的那样,在内部完成这项工作成本并不高(。
顺序从pandas/hashtable.pyx.build_count_table_object()
更改为。pymap
的大小调整通过散列值来移动条目。
以下是的完整讨论