Pandas系列value_counts对不同计数的工作方式不同



例如:

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. C:ProgramDataAnaconda3Libsite-packagespandascorealgorithims.py581是原始实现
  2. bins=None时,它为int64值调用_value_counts_arraylike
  3. 此函数调用-keys, counts = htable.value_count_int64(values, dropna)

如果您查看htable实现,您会得出结论,密钥的顺序是任意的,这取决于hashtable的工作方式。

它不能保证任何形式的订购。通常,这个例程按最大值进行排序,这几乎总是你想要的。

我想他们可以将其更改为sort=False平均原始排序。我不知道这是否真的会破坏任何东西(正如众所周知的那样,在内部完成这项工作成本并不高(。

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

以下是的完整讨论

最新更新