pandas Series.value_counts返回相等计数字符串的不一致顺序

Kda*_*awg 6 python sorting counter numpy pandas

当我运行以下代码时:

s = pandas.Series(['c', 'a', 'b', 'a', 'b'])
print(s.value_counts())
Run Code Online (Sandbox Code Playgroud)

有时我得到这个:

a    2
b    2
c    1
dtype: int64
Run Code Online (Sandbox Code Playgroud)

有时我得到这个:

b    2
a    2
c    1
dtype: int64
Run Code Online (Sandbox Code Playgroud)

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

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

我希望它仍然按计数降序排序,但要按等效计数项的顺序保持一致.

我正在运行Python 3.7.0和pandas 0.23.4

jpp*_*jpp 6

给定一个系列,您有几个选项可以一致地排序:

s = pd.Series(['a', 'b', 'a', 'c', 'c'])
c = s.value_counts()
Run Code Online (Sandbox Code Playgroud)

按索引排序

使用pd.Series.sort_index

res = c.sort_index()

a    2
b    1
c    2
dtype: int64
Run Code Online (Sandbox Code Playgroud)

按计数排序(任意关系)

对于降序计数,什么都不做,因为这是默认值。否则,您可以使用pd.Series.sort_values,默认为ascending=True。在任何一种情况下,您都不应该对如何处理关系做出任何假设。

res = c.sort_values()

b    1
c    2
a    2
dtype: int64
Run Code Online (Sandbox Code Playgroud)

更有效地,您可以使用c.iloc[::-1]颠倒顺序。

按计数排序,然后按索引排序

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

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

a    2
c    2
b    1
dtype: int64
Run Code Online (Sandbox Code Playgroud)