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
给定一个系列,您有几个选项可以一致地排序:
s = pd.Series(['a', 'b', 'a', 'c', 'c'])
c = s.value_counts()
Run Code Online (Sandbox Code Playgroud)
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)