【问题标题】:pandas value_counts: sort by value, then alphabetically?pandas value_counts:按值排序,然后按字母顺序?
【发布时间】:2021-09-14 21:38:56
【问题描述】:

我有以下数据框:

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

我找到了this answer,但它看起来已经过时了。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    似乎只使用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
    

    【讨论】:

    • 哪个熊猫和蟒蛇?我先吃桃子再吃苹果。
    • @ALollz pd.__version__ Out[821]: '0.23.4'
    • @ALollz 你能不能试试更新工作?
    • 谢谢!所以作为参考,完整的解决方案是df.fruit.value_counts().sort_index(ascending=False).sort_values(ascending=False)
    • 好像跟版本有关!对于1.3.1,它只能作为df.fruit.value_counts().sort_index(ascending=True).sort_values(ascending=False) 工作(因为它应该是,因为'a' < 'p',它正在上升!),但对于1.1.2,反之亦然。
    【解决方案2】:

    您可以做到这一点,但输出将是一个元组列表,该列表按水果名称的字母顺序和水果的数量排序。首先将 value_counts() 输出转换为字典,然后使用 items 函数将其转换为元组列表并对它们进行排序:

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

    【讨论】:

      【解决方案3】:

      注意:接受的答案存在一些混淆。我建议使用此解决方案以确保它在不同版本之间确定性地运行。

      你可以这样做(如果你真的不关心细节):

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-23
        • 1970-01-01
        • 2018-11-23
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多