Pyhton、Numpy、Pandas排序小结

Python Help

#用built-in函数sorted进行排序,返回副本,原始输入不变
sorted(...)
    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

#用List的成员函数sort进行排序,在本地进行排序,不返回副本
sort(...)
    L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
    cmp(x, y) -> -1, 0, 1

参数说明

  • cmp:接受函数(传入函数,函数亦对象)
  • key:接受函数,这个函数只接受一个值。

operator函数

# Help on class itemgetter in module operator:

class itemgetter(__builtin__.object)
 |  itemgetter(item, ...) --> itemgetter object
 |
 |  Return a callable object that fetches the given item(s) from its operand.
 |  After f = itemgetter(2), the call f(r) returns r[2].
 |  After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])


In [2]: from operator import itemgetter

In [3]: a = [1, 2, 3]

In [4]: b = itemgetter(1)

In [5]: b(a)
Out[5]: 2

In [7]: students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),]

# Use key function
In [8]: sorted(students, key=lambda student : student[2])
Out[8]: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

# Use cmp function
In [9]: sorted(students, cmp=lambda x,y : cmp(x[2], y[2]))
Out[9]: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

# Use operator.itemgetter
In [10]: sorted(students, key=itemgetter(2))
Out[10]: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

# 用operator函数实现多级排序
In [11]: sorted(students, key=itemgetter(1,2))
Out[11]: [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

# 对字典排序,返回由tuple组成的List,不再是字典
In [12]: d = {'data1':3, 'data2':1, 'data3':2, 'data4':4}

In [13]: sorted(d.iteritems(), key=itemgetter(1), reverse=True)
Out[13]: [('data4', 4), ('data1', 3), ('data3', 2), ('data2', 1)]

Numpy

跟Python内置的列表一样,ndarray的sort实例方法也是就地排序。
但是,numpy.sort会为原数组创建一个已排序副本。 (类似于List.sort() -> 就地排序 | sorted() -> 返回副本)

两个排序方法(np.sort(arr) and arr.sort())都可以接受一个axis参数,以便沿指定轴向对各块数据进行单独排序。

间接排序

arr.argsort() and numpy.lexsort(): 索引值说明了数据在新顺序下的位置。

注: Series和DataFrame的sort_index以及Series的order方法就是通过这些函数的变体实现的。

Pandas

sort_index()

对行或列索引进行排序

In [1]: import pandas as pd

In [2]: from pandas import DataFrame, Series

In [3]: obj = Series(range(4), index=['d','a','b','c'])

In [4]: obj
Out[4]:
d    0
a    1
b    2
c    3
dtype: int64

In [5]: obj.sort_index()
Out[5]:
a    1
b    2
c    3
d    0
dtype: int64

In [6]: import numpy as np

In [8]: frame = DataFrame(np.arange(8).reshape((2,4)), index=['three','one'],
   ...:                   columns=['d','a','b','c'])

In [9]: frame
Out[9]:
       d  a  b  c
three  0  1  2  3
one    4  5  6  7

In [10]: frame.sort_index()
Out[10]:
       d  a  b  c
one    4  5  6  7
three  0  1  2  3

In [11]: frame.sort_index(axis=1)
Out[11]:
       a  b  c  d
three  1  2  3  0
one    5  6  7  4

In [12]: frame.sort_index(axis=1, ascending=False)
Out[12]:
       d  c  b  a
three  0  3  2  1
one    4  7  6  5
sort_values

对Series按进行排序, 排序时,任何缺失值默认都会被放到Series的末尾。

In [18]: obj = Series([4, np.nan, 6, np.nan, -3, 2])

In [19]: obj
Out[19]:
0    4.0
1    NaN
2    6.0
3    NaN
4   -3.0
5    2.0
dtype: float64

In [21]: obj.sort_values()
Out[21]:
4   -3.0
5    2.0
0    4.0
2    6.0
1    NaN
3    NaN
dtype: float64

在DataFrame上,根据一个或多个列中的值进行排序。将一个或多个列的名字传递给by选项即可达到该目的:

In [16]: frame.sort_values(by='b')
Out[16]:
       d  a  b  c
three  0  1  2  3
one    4  5  6  7
间接统计

idxmin, idxmax:达到最小值或最大值的索引。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值