pandas value_counts: 按值排序,然后按字母顺序排序吗?

8

I have the following data frame:

df = pd.DataFrame({
    'fruit':
       ['peaches']*5 + ['apples']*5 + ['bananas']*3 + 
       ['nectarines']*3 + ['carrots']*3 + ['apricots'] 
})

我希望您能将输出按照水果数量进行排序,并按照水果名称的字母顺序进行排序:

apples        5
peaches       5
bananas       3
carrots       3
nectarines    3
apricots      1

我发现这篇回答,但它似乎已经过时了。

3个回答

19

看起来只需使用value_counts即可得到结果

df.fruit.value_counts()
Out[818]: 
apples        5
peaches       5
bananas       3
carrots       3
nectarines    3
apricots      1
Name: fruit, dtype: int64

更新

df.fruit.value_counts().sort_index(ascending=False).sort_values(ascending=False)    

apples        5
peaches       5
bananas       3
carrots       3
nectarines    3
apricots      1
Name: fruit, dtype: int64

使用哪个pandas和python?我先得到桃子再得到苹果。 - ALollz
@ALollz pd.version Out[821]: '0.23.4' - BENY
@ALollz,你能否尝试一下更新工作,看看是否可行? - BENY
谢谢!因此,完整的解决方案是 df.fruit.value_counts().sort_index(ascending=False).sort_values(ascending=False) - Richard
好像这取决于版本!在 1.3.1 中,它只能按照 df.fruit.value_counts().sort_index(ascending=True).sort_values(ascending=False) 进行操作(因为 'a' < 'p' ,所以应该升序排列!),但在 1.1.2 中则相反。 - Balint

0

注意:关于被接受的答案存在一些混淆。我建议使用这个解决方案,以确保它在不同版本中运行具有确定性。

如果您不太关心细节,可以这样做:

df.fruit.value_counts().reset_index().sort_values(
    ['fruit', 'index'], ascending=[False, True]
)

输出为数据框:

        index  fruit
1      apples      5
0     peaches      5
2     bananas      3
4     carrots      3
3  nectarines      3
5    apricots      1

但如果你在意,那就是精确的答案:

df.fruit.value_counts().reset_index().sort_values(
    ['fruit', 'index'], ascending=[False, True]
).set_index('index').rename_axis(None)['fruit']

以完全相同的格式输出:

apples        5
peaches       5
bananas       3
carrots       3
nectarines    3
apricots      1
Name: fruit, dtype: int64

0
你可以实现这个,但输出将是一个按水果名称字母顺序排序并带有水果数量的元组列表。首先将 value_counts() 的输出转换为字典,然后使用 items 函数将其转换为元组列表,并对其进行排序。

sorted(dict(df.fruit.value_counts()).items())


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接