【问题标题】:Pandas value_counts(sort=False) with large series doesn't work大系列的 Pandas value_counts(sort=False) 不起作用
【发布时间】:2015-11-12 09:47:57
【问题描述】:

默认Series.values_counts按计数降序排列:

In [192]: pd.Series([3,0,2,0,0,1,0,0,0,1,1,0,1,0,2,2,2,2,2,0,0,2]).value_counts()
Out[192]: 
0    10
2     7
1     4
3     1
dtype: int64

如果我通过sort=False,它似乎会尝试按值键排序:

In [193]: pd.Series([3,0,2,0,0,1,0,0,0,1,1,0,1,0,2,2,2,2,2,0,0,2]).value_counts(sort=False)
Out[193]: 
0    10
1     4
2     7
3     1
dtype: int64

但是当我增加系列的长度时,排序会恢复到原来的顺序:

In [194]: pd.Series([3,0,2,0,0,1,0,0,0,1,1,0,1,0,2,2,2,2,2,0,0,2]*100).value_counts(sort=False)
Out[194]: 
0    1000
2     700
1     400
3     100
dtype: int64

有什么想法吗?

【问题讨论】:

  • value_counts(sort=False) 没有声明结果的排序顺序。第一个示例中的按键排序是一个实现细节,您不应依赖其排序行为。

标签: pandas


【解决方案1】:

这是正确的。您要求 .value_counts() 不对结果进行排序,所以它没有。下面我模拟sort=True 的实际作用,它只是一个sort_values。如果你不排序,那么你将得到由哈希表完成的计数结果,因此是任意顺序的。

In [39]: pd.Series([3,0,2,0,0,1,0,0,0,1,1,0,1,0,2,2,2,2,2,0,0,2]).value_counts(sort=False).sort_values(ascending=False)
Out[39]: 
0    10
2     7
1     4
3     1
dtype: int64

In [40]: pd.Series([3,0,2,0,0,1,0,0,0,1,1,0,1,0,2,2,2,2,2,0,0,2]*100).value_counts(sort=False).sort_values(ascending=False)
Out[40]: 
0    1000
2     700
1     400
3     100
dtype: int64

【讨论】:

  • 好吧,我想这是有道理的。那么你将如何按键对values_counts 进行排序呢?我认为这将是一个内置功能,因为如果没有这个功能,value_counts 几乎无法绘制分组条形图,这是我唯一想要使用它的东西。
  • .sort_index() 按索引排序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 2014-06-05
  • 2018-01-29
  • 2022-12-02
  • 2017-05-05
  • 2016-02-17
相关资源
最近更新 更多