【问题标题】:How to sort/ group a Pandas data frame by class label or any specific column如何按类标签或任何特定列对 Pandas 数据框进行排序/分组
【发布时间】:2017-01-31 21:40:49
【问题描述】:
class col2 col3 col4 col5
1     4    5    5    5
4     4    4.5  5.5  6
1     3.5  5    6    4.5
3     3    4    4    4
2     3    3.5  3.8  6.1

我在示例中使用了假设数据。真实 DataFrame 的形状是 6680x1900。我已将这些数据聚集到50 标记的类(1 到 50)中。如何按class 标签的升序对这些数据进行排序?

我试过了:

df.groupby([column_name_lst])["class"]

但它失败并出现此错误:

TypeError: 你必须提供 'by' 和 'level' 之一

如何解决这个问题?预期输出为:

class col2 col3 col4 col5
1     4    5    5    5
1     3.5  5    6    4.5
2     3    3.5  3.8  6.1
3     3    4    4    4
4     4    4.5  5.5  6

【问题讨论】:

    标签: python sorting pandas dataframe group-by


    【解决方案1】:

    如果classSeries,我认为你可以使用DataFrame.sort_values

    print (type(df['class']))
    <class 'pandas.core.series.Series'>
    
    
    print (df.sort_values(by='class'))
       class  col2  col3  col4  col5
    0      1   4.0   5.0   5.0   5.0
    2      1   3.5   5.0   6.0   4.5
    4      2   3.0   3.5   3.8   6.1
    3      3   3.0   4.0   4.0   4.0
    1      4   4.0   4.5   5.5   6.0
    

    另外如果需要groupby,使用参数by

    print (df.groupby(by='class').sum())
           col2  col3  col4  col5
    class                        
    1       7.5  10.0  11.0   9.5
    2       3.0   3.5   3.8   6.1
    3       3.0   4.0   4.0   4.0
    4       4.0   4.5   5.5   6.0
    

    如果classindex,则使用Kartik solution

    print (df.index)
    Int64Index([1, 4, 1, 3, 2], dtype='int64', name='class')
    
    print (df.sort_index())
           col2  col3  col4  col5
    class                        
    1       4.0   5.0   5.0   5.0
    1       3.5   5.0   6.0   4.5
    2       3.0   3.5   3.8   6.1
    3       3.0   4.0   4.0   4.0
    4       4.0   4.5   5.5   6.0
    

    另外如果需要groupby,使用参数level

    print (df.groupby(level='class').sum())
           col2  col3  col4  col5
    class                        
    1       7.5  10.0  11.0   9.5
    2       3.0   3.5   3.8   6.1
    3       3.0   4.0   4.0   4.0
    4       4.0   4.5   5.5   6.0
    

    index,但第一个解决方案更好,因为更通用:

    print (df.groupby(df.index).sum())
           col2  col3  col4  col5
    class                        
    1       7.5  10.0  11.0   9.5
    2       3.0   3.5   3.8   6.1
    3       3.0   4.0   4.0   4.0
    4       4.0   4.5   5.5   6.0
    

    【讨论】:

    • df.sort_values(by='class') 这个工作完美。谢谢
    • 很高兴能为您提供帮助。美好的一天!
    【解决方案2】:

    如果您从问题中的数据开始:

    class col2 col3 col4 col5
    1     4    5    5    5
    4     4    4.5  5.5  6
    1     3.5  5    6    4.5
    3     3    4    4     4
    2     3   3.5   3.8   6.1
    

    并且想要对其进行排序,那么这取决于'class' 是索引还是列。如果索引:

    df.sort_index()
    

    应该会给你答案。如果列,请关注answer by @jezarael

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 2020-03-08
      • 2018-08-27
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 2021-05-06
      • 2021-06-25
      相关资源
      最近更新 更多