【问题标题】:pandas Series.value_counts returns inconsistent order for equal count stringspandas Series.value_counts 返回相等计数字符串的不一致顺序
【发布时间】:2019-01-26 18:16:39
【问题描述】:

当我运行下面的代码时:

s = pandas.Series(['c', 'a', 'b', 'a', 'b'])
print(s.value_counts())

有时我会明白:

a    2
b    2
c    1
dtype: int64

有时我会得到这个:

b    2
a    2
c    1
dtype: int64

例如等效计数返回的索引顺序不同。如果 Series 值是整数而不是字符串,我无法重现这一点。

为什么会发生这种情况,每次获得相同索引顺序的最有效方法是什么?

我希望它仍然按计数降序排序,但在等效计数项目的顺序上保持一致。

我正在运行 Python 3.7.0 和 pandas 0.23.4

【问题讨论】:

  • 你得到的值是按照计数排序的。在您的情况下,a 和 b 具有相同的频率,因此,您获得的输出可能会根据 CPU 分配而有所不同。
  • 查看相关问题here
  • @user2285236,谢谢,订单更改的地方已明确指出:“订单已从 pandas/hashtable.pyx.build_count_table_object() 更改。调整 pymap 的大小通过散列值移动条目。 "

标签: python pandas sorting numpy counter


【解决方案1】:

value_counts 之后添加reindex

df.value_counts().reindex(df.unique())
Out[353]: 
a    1
b    1
dtype: int64

更新

s.value_counts().sort_index().sort_values()

【讨论】:

  • 如果不是所有项目都以相同的频率出现,这将撤消按计数排序。
【解决方案2】:

你可以使用sort_index:

print(df.value_counts().sort_index())

输出:

a    1
b    1
dtype: int64

如果您想使用参数(如ascending=True 等),请参阅documentation

sort_index vs reindex(df.unique())(如@Wen 所建议)似乎表现非常相似:

df.value_counts().sort_index():         1000 loops, best of 3: 636 µs per loop
df.value_counts().reindex(df.unique()): 1000 loops, best of 3: 880 µs per loop

【讨论】:

  • 如果不是所有项目都以相同的频率出现,这也会撤消按计数排序。
  • 好的,你稍微改变了我看到的问题。 jpp的回答对你有用吗?
【解决方案3】:

在给定系列的情况下,您有几个选项可以一致地排序:

s = pd.Series(['a', 'b', 'a', 'c', 'c'])
c = s.value_counts()

按索引排序

使用pd.Series.sort_index:

res = c.sort_index()

a    2
b    1
c    2
dtype: int64

按计数排序(平局任意)

对于递减计数,什么都不做,因为这是默认值。否则,您可以使用pd.Series.sort_values,默认为ascending=True。在任何一种情况下,您都不应该对平局的处理方式做出任何假设。

res = c.sort_values()

b    1
c    2
a    2
dtype: int64

更高效,您可以使用c.iloc[::-1] 反转顺序。

按计数排序,然后按索引

您可以使用numpy.lexsort 按计数和然后按索引排序。注意相反的顺序,即-c.values 用于first进行排序。

res = c.iloc[np.lexsort((c.index, -c.values))]

a    2
c    2
b    1
dtype: int64

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2023-01-26
    • 2013-09-04
    相关资源
    最近更新 更多