python 排序、排名、合并、修改(字符串、列表、numpy、pandas)等

参考:https://blog.csdn.net/haiyang_duan/article/details/79221458
1、排序:
字符串和列表,都使用sort函数,默认都为升序,若想为降序,使用reverse=True
####不改变列表的结构和内容,产生一个新的列表
a=[1,2,5,4]
sorted(a)

####改变列表的结构和内容
a.sort()
______________________________________________numpy_______________________________________
numpy数组的排序:(sort、argsort、lexsort、numpy.searchsorted、numpy.partition、)
默认都为升序,若需要降序,加上ascending=True
####不改变原数组结构内容,生成一个新的数组
a=np.array([[1,3,2,4],[5,8,7,6]])
numpy.sort(a, axis=1, kind='quicksort', order=None)
a:所需排序的数组 
axis:数组排序时的基准,axis=0,按行排序;axis=1,按列排序
kind:数组排序时使用的方法,其中: 
kind=′quicksort′  为快排;kind=′mergesort′为混排;kind=′heapsort′为堆排; 
order:一个字符串或列表,可以设置按照某个属性进行排序

####改变数组的结构内容
a.sort(axis=0) 

####按照指定的列进行排序
#第三列进行排序,注意:argsort返回的只是排好序后的行索引,不会改变原数组
a=a[a[:,2].argsort()]

#####numpy.lexsort:
a:所需排序的数组 
axis:数组排序时的基准,axis=0,按行排列;axis=1,按列排列 
kind :数组排序时使用的方法,其中: 
   kind='quicksort'为快排;kind= ′ mergesort ′为混排;kind='heapsort'为堆排; 
order :一个字符串或列表,可以设置按照某个属性进行排序
>>> a=[1,5,1,4,3,4,4]
>>> b=[9,4,0,4,0,2,1]
>>> np.lexsort((b,a))
# b在前,a在后,即是先按照a的元素进行比较
# 如a中的最小值为两个1,其索引分别为0,2,再计较b中相应索引上的值,即9,0
# 对应的最小应是:1,0,而其对应的索引为2,所以排序后返回的结果第一个值为索引2
# 下一个最小应是:1,9,而其对应的索引为0,所以排序后返回的结果第一个值为索引0
# 以此类推...
array([2, 0, 4, 6, 5, 3, 1], dtype=int64)
>>> np.lexsort((a,b))
# a在前,b在后,即是先按照b的元素进行比较
# 如b中的最小值为两个0,其索引分别为0,4,再计较a中相应索引上的值,即1,3
# 对应的最小应是:0,1,而其对应的索引为2,所以排序后返回的结果第一个值为索引2
# 下一个最小应是:0,3,而其对应的索引为4,所以排序后返回的结果第一个值为索引4
# 以此类推...
array([2, 4, 6, 5, 3, 1, 0], dtype=int64)
>>> c=[[1,5,1,4,3,4,4],[9,4,0,4,0,2,1]]
>>> c
[[1, 5, 1, 4, 3, 4, 4], [9, 4, 0, 4, 0, 2, 1]]
>>> np.lexsort(c)
# 此种情况与先b后a的情况一致
array([2, 4, 6, 5, 3, 1, 0], dtype=int64)


#######numpy.searchsorted
a:所需排序的数组 
v:待查询索引的元素值 
side :查询索引时的方向,其中: 
       kind= ′ left ′为从左至右;kind= ′ right ′ 为从右至左 
sorder :一个字符串或列表,可以设置按照某个属性进行排序

>>> list3=[1,2,3,4,5]
>>> np.searchsorted(list3,2)
1
# 如若要在list3中插入元素2,则应当将其插在原列表索引为1的地方,即是插在元素1的后面
>>> np.searchsorted(list3,[-5,7,4,9])
array([0, 5, 3, 5], dtype=int64)
# 如若要在list3中插入元素-5,则应当将其插在原列表索引为0的地方,即是插在元素1的前面
# 其他以此类推...

其中list3必须为顺序,当为乱序的时候,必须先排序:

np.searchsorted(list3, 4, sorder = numpy.argsort(list3))

#######numpy.partition
>>>list=[3,4,5,2,1]
>>>np.partition(list,3)
array([2, 1, 3, 4, 5])
# 以排序后的第3个数,即3进行分区,分区后的结果即是:
# 小于3的元素2,1位于3的前面,大于等于3的元素4,5位于3的后面

#####numpy.argpartition
返回数组的分区副本。
创建数组的副本,其元素重新排列,使得第k个位置的元素值位于排序数组中的位置。小于第k个元素的所有元素都在此元素之前移动,并且所有元素都等于或大于它。
两个分区中元素的排序是未定义的。
 

参数:

a:array_like

要排序的数组。

kth:int或int的序列

要分区的元素索引。元素的第k个值将处于其最终排序位置,所有较小元素将在它之前移动,并且所有较小元素将在其后面移动。分区中的所有元素的顺序是未定义的。如果提供了第k个序列,它将立即将由第k个索引的所有元素分成它们的排序位置。

axis:int或None,可选

Axis沿着它排序。如果为None,则在排序之前将数组展平。默认值为-1,它沿最后一个轴排序。

kind:{'introselect'},可选

选择算法。默认为'introselect'。

order:str或str的列表,可选

a是定义了字段的数组时,此参数指定要比较哪些字段的第一个,第二个等。可以将单个字段指定为字符串。并非所有字段都需要指定,但是仍然会按照它们在dtype中出现的顺序使用未指定的字段来断开关系。

返回:

partitioned_array:ndarray

a相同类型和形状的数组。

arr=np.array([3,4,2,1])
print(np.partition(arr,(1,3))) #显示的是元素
print(np.argpartition(arr,(1,3)))  #显示的是已排好顺序的索引
print(np.argpartition(arr,3)) 
另外argpartition可以找出指定的元素,显示的是排序次数
比如:找到数组的第3小(index=2)的值和第2大(index=-2)的值
print(arr[np.argpartition(arr, 2)[2]])

______________________________________pandas______________________________

根据索引的大小或者值的大小对Series和DataFrame进行排名和排序。
##################sort_index 默认为升序,如要为降序加上 ascending=False
pandas提供了sort_index方法可以根据行或列的索引按照字典的顺序进行排序
 s = pd.Series([1,2,3],index=["a","c","b"])
### #对Series的索引进行排序,默认是升序
print(s.sort_index())
print(s.sort_index(ascending=False))
###对Series的值进行排序,默认是按值的升序进行排序的,对值进行排序的时候,无论是升序还是降序,缺失值(NaN)都会排在最后面。
print(s.sort_values())
print(s.sort_values(ascending=False))

DataFrame排序:
a = np.arange(9).reshape(3,3)
data = pd.DataFrame(a,index=["0","2","1"],columns=["c","a","b"])
##按行的索引升序进行排序,默认按行,升序
print(data.sort_index())
print(data.sort_index(ascending=False))
##按列升序的索引进行排序,默认升序
print(data.sort_index(axis=1))
print(data.sort_index(axis=1,ascending=False))
####按指定列的值大小顺序进行排序,默认升序
 print(data.sort_values(by="c"))
#先对C列进行排序,排好之后再对a列进行排序
print(data.sort_values(by=["c","a"]))
###按指定行值进行排序,对索引为0的所在行进行排序
print(data.sort_values(by="0",axis=1))
注意:对DataFrame的值进行排序的时候,我们必须要使用by指定某一行(列)或者某几行(列),如果不使用by参数进行指定的时候,就会报TypeError: sort_values() missing 1 required positional argument: 'by'。使用by参数进行某几列(行)排序的时候,以列表中的第一个为准,可能后面的不会生效,因为有的时候无法做到既对第一行(列)进行升序排序又对第二行(列)进行排序。在指定行值进行排序的时候,必须设置axis=1,不然会报错,因为默认指定的是列索引,找不到这个索引所以报错,axis=1的意思是指定行索引。

——————————————pandas 里面存在排名的概念
##Series的排名
s = pd.Series([1,3,2,1,6],index=["a","c","d","b","e"])

'''1是最小的,所以第一个1排在第一,第二个1排在第二,因为取的是平均排名,所以1的排名为1.5'''
#rank函数返回从小到大排序的下标,对于平级的数,rank是通过“为各组分配一个平均排名”的方式破坏评级关系
print(s.rank())
###根据值在数组中出现的顺序进行排名
print(s.rank(method="first"))
method参数除了,first按值在原始数据中的出现顺序分配排名,还有min使用整个分组的最小排名,max是用整个分组的最大排名,average使用平均排名,也是默认的排名方式。还可以设置ascending参数,设置降序还是升序排序。

##DataFrame的排名
a = [[9, 3, 1], [1, 2, 8], [1, 0, 5]]
data = DataFrame(a, index=["0", "2", "1"], columns=["c", "a", "b"])
#默认按列进行排名
print(data.rank())
#按行进行排名
print(data.rank(axis=1))
method参数和ascending参数的设置与Series一样。

________________________________________合并
字符串:使用+ , join
列表:切片,赋值,append,insert等等

##numpy数组的合并

  • np.append()
  • np.concatenate()
  • np.stack()
  • np.hstack()
  • np.vstack()
  • np.dstack()

    Python中numpy数组的合并有很多方法,如

    np.append()
    np.concatenate()
    np.stack()
    np.hstack()
    np.vstack()
    np.dstack()
    其中最泛用的是第一个和第二个。第一个可读性好,比较灵活,但是占内存大。第二个则没有内存占用大的问题。

    方法一——append

    parameters introduction
    arr 待合并的数组的复制(特别主页是复制,所以要多耗费很多内存)
    values 用来合并到上述数组复制的值。如果指定了下面的参数axis的话,则这些值必须和arr的shape一致(shape[axis]之外都相等),否则的话,则没有要求。
    axis 要合并的轴
    例程:


    方法二——concatenate

    parameters introduction
    *arrays 这些数组除了在待合并的axis(默认为axis=0)上之外,必须具有相同的shape
    axis 待合并的轴,默认为0


    #####pandas上的合并
    pandas上的合并:
    concat:依托列名和索引名来合并,合并前确认索引名和列名是否一致.

    pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)

  • objs: series,dataframe或者是panel构成的序列lsit
  • axis: 需要合并的轴,0是行,1是列
  • 连接的方式 inner,或者outer
  • 也可以给数组加一层外索引,通过key关键词加
  •  
  • join 连接: 首先确认




     



 

 

 

猜你喜欢

转载自blog.csdn.net/qq_24726509/article/details/83451047
今日推荐