美文网首页seq 比对
深入浅出Pandas--数据排序

深入浅出Pandas--数据排序

作者: 亦是旅人呐 | 来源:发表于2022-05-29 09:23 被阅读0次

    对应书本第二部分第5章Pandas高级操作第3节


    数据排序是指按一定的顺序将数据重新排列,帮助使用者发现数据的变化趋势,同时提供一定的业务线索,还具有对数据纠错、分类等作用


    索引排序

    df.sort_index()实现按索引排序,默认以从小到大的升序方式排列。如希望按降序排序,传入ascending=False:

    # 索引降序
    df.sort_index(ascending=False)
    
    # 在列索引方向上排序
    df.sort_index(axis=1, ascending=False)
    
    # 这里的s我理解为Series,需要赋值
    s.sort_index() # 升序排列
    df.sort_index() # df也是按索引进行排序
    df.team.sort_index()
    s.sort_index(ascending=False) # 降序排列
    s.sort_index(inplace=True) # 排序后生效,改变原数据
    # 索引重新0-(n-1)排,很有用,可以得到它的排序号
    s.sort_index(ignore_index=True)
    s.sort_index(na_position='first') # 空值在前,另'last'表示空值在后
    s.sort_index(level=1) # 如果多层,排一级
    s.sort_index(level=1, sort_remaining=False) # 这层不排
    # 行索引排序,表头排序
    df.sort_index(axis=1) # 会把列按列名顺序排列
    

    df.reindex()指定自己定义顺序的索引,实现行和列的顺序重新定义:

    df = pd.DataFrame({
    'A': [1,2,4],
    'B': [3,5,6]
    }, index=['a', 'b', 'c'])
    df
    
    # 按要求重新指定索引顺序
    df.reindex(['c', 'b', 'a'])
    
    # 指定列顺序
    df.reindex(['B', 'A'], axis=1)
    

    数值排序

    数据值的排序主要使用sort_values(),数字按大小顺序,字符按字母顺序。Series和DataFrame都支持此方法:

    df.Q1.sort_values()
    

    DataFrame需要传入一个或多个排序的列名:

    df.sort_values('Q4')
    

    默认排序是升序,但可以指定排序方式,下例先按team升序排列,如遇到相同的team再按name降序排列。

    df.sort_values(by=['team', 'name'], ascending=[True, False])
    
    # 这里的s我理解为Series,需要赋值
    s.sort_values(ascending=False) # 降序
    s.sort_values(inplace=True) # 修改生效
    s.sort_values(na_position='first') # 空值在前
    # df按指定字段排列
    df.sort_values(by=['team'])
    df.sort_values('Q1')
    # 按多个字段,先排team,在同team内再看Q1
    df.sort_values(by=['team', 'Q1'])
    # 全降序
    df.sort_values(by=['team', 'Q1'], ascending=False)
    # 对应指定team升Q1降
    df.sort_values(by=['team', 'Q1'], ascending=[True, False])
    # 索引重新0-(n-1)排
    df.sort_values('team', ignore_index=True)
    

    混合排序

    有时候需要用索引和数据值混合排序。下例中假如name是索引,我们需要先按team排名,再按索引排名:

    df.set_index('name', inplace=True) # 设置name为索引
    df.index.names = ['s_name'] # 给索引起名
    df.sort_values(by=['s_name', 'team']) # 排序
    

    以下方法也可以实现上述需求,不过要注意顺序:

    df = pd.read_excel('team.xlsx')
    # 设置索引,按team排序,再按索引排序
    df.set_index('name').sort_values('team').sort_index()
    

    另外,还可以使用df.reindex(),通过给定新的索引方式来排名,按照这个思路可以实现人工指定任意顺序。

    # 按姓名排序后取出排名后的索引列表
    df.name.sort_values().index
    # 将新的索引应用到数据中
    df.reindex(df.name.sort_values().index)
    # 上面与直接使用name排序是一个结果
    df.sort_values('name')
    # 但是如果需要自己修改指定的顺序,则将指定顺序索引Series传给reindex()
    

    按值大小排序

    nsmallest()和nlargest()用来实现数字列的排序,并可指定返回的个
    数:

    # 先按Q1最小在前,如果相同,Q2小的在前
    df.nsmallest(5, ['Q1', 'Q2'])
    # 取出切片
    s = df['Q1']
    s.nsmallest(3) # 最小的3个
    s.nlargest(3) # 最大的3个
    # 指定列
    df.nlargest(3, 'Q1')
    df.nlargest(5, ['Q1', 'Q2'])
    df.nsmallest(5, ['Q1', 'Q2'])
    

    end~

    相关文章

      网友评论

        本文标题:深入浅出Pandas--数据排序

        本文链接:https://www.haomeiwen.com/subject/yvjuprtx.html