【问题标题】:Pandas Series value_counts working differently for different countsPandas 系列 value_counts 对不同计数的工作方式不同
【发布时间】:2018-11-14 06:22:36
【问题描述】:

例如:

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

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

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

    如果您浏览源代码 -

    1. C:\ProgramData\Anaconda3\Lib\site-packages\pandas\core\algorithims.py line 581 是原始实现
    2. bins=None 时,它调用_value_counts_arraylike 获取int64
    3. 此函数调用 - keys, counts = htable.value_count_int64(values, dropna)

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

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

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

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

    这里是full 讨论

    【讨论】:

    • 当键是任意顺序时,它不能保证任意数量的计数对吧?但如果计数很小,它会保留顺序,如果计数很高,则不是。此外,它维持秩序直到 341 计数,但在它之后失败。
    • 这似乎是保留 github page 的原始订单的一些更新,看起来正在使用与 reindex(unique(values)) 相同的更新 :-) 这是唯一的方法,因此必须重新索引以保留原始订单跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    相关资源
    最近更新 更多