apply和applymap

  1. apply:可以把一个用在一维数组上的函数,应用在一行或一列上。若axis='column’用于apply,那么函数会被用在每一行。
    例:
f = lambda x: x.max() - x.min()
frame.apply(f)
#计算每列最大最小值之差
#frame.apply(f, axis='column')则是应用到每行

b    2.658256
d    0.720526
e    1.784479
dtype: float64
  1. applymap:可以实现element-wise的python函数
    例:格式化frame中的浮点数,变为string
format = lambda x: '%.2f' % x
frame.applymap(format)
  1. map:series中的一个函数,可以实现element-wise,applymap就是利用该函数实现的

排序

按行或列排序(sort_index)

语法:对象.sort_index()

  • 对象可以是series或dataframe
  • 默认按行排序,axis=1则按列排序
  • 默认升序,ascending=False则为降序

按值排序(sort_values)

语法:对象.sort_values()

  • 缺失值会被排在最后
  • 对于dataframe,一般需要指定按哪列或哪行进行排序,即设参数by
    例:
frame = pd.DataFrame({'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1]})
frame.sort_values(by='b') #按b列排序
frame.sort_values(by=['a', 'b']) #按b,a两列排序

rank

  • rank方法能用于series和DataFrame
  • rank方法默认会给每个group一个mean rank(平均排名)
  • rank 表示在这个数在原来的Series中排第几名,有相同的数,取其排名平均(默认)作为值
  • rank也可以根据数据被观测到的顺序来设定,设method='first’即可
    例:
obj = pd.Series([7, -5, 7, 4, 2, 0, 4])
#按值排序
obj.sort_values()

1   -5
5    0
4    2
3    4
6    4
0    7
2    7
dtype: int64

#rank排序按值的顺序
obj.rank()

0    6.5
1    1.0
2    6.5
3    4.5
4    3.0
5    2.0
6    4.5
dtype: float64

#rank排序按被观测的顺序
obj.rank(method='first')

0    6.0
1    1.0
2    7.0
3    4.0
4    3.0
5    2.0
6    5.0
dtype: float64

说明:

  1. rank按值排序:在obj中,按值排序4和4的排名是第4名和第五名,取平均得4.5。7和7的排名分别是第六名和第七名,则其排名取平均得6.5。也就是说在按值排序的基础上,如果重复出现,平均排名给予rank。
  2. rank按观测排序:这里没有给0和2(指两个数字7)赋予average rank 6.5,而是给第一个看到的7(label 0)设置rank为6,第二个看到的7(label 2)设置rank为7。也就是说在按值排序的基础上,如果重复出现,按观测顺序依次给予rank。
  3. dataframe的用法类似,只不过在此基础上可以指定按行还是按列(axis='columns’指列与列之间的排序)

数据合并

merge

类似MySQL的连接,语法为

pd.merge(df1, df2, on = 'key', how = 'left')

前两个参数是需要合并的两个数据框
on指合并参照的主键
how指的是合并方式,默认为内连接,还可以选择’left’,或’right’

concat

既可以行合并也可以列合并,语法为:

pd.concat([df1, df2], axis = 0)

axis指合并方向,默认为0,即行合并
注:可以通过join参数指定内连接或外连接(inner、outer)

区别

  • concat和append可以实现的是表间”拼接“,而merge和join则实现的是表间”合并“。区别在于是否基于”键“来进行合并。如果只是简单地”堆砌“,则用concat和append比较合适,而如果遇到关联表,需要根据”键“来合并,则用merge和join。
  • concat 和 merge是pandas的属性,所以调用的时候应该写成pd.concat()或者pd.merge();而append和join是对DataFrame的方法,所以调用的时候应该写成df.append()或者df.join()。
  • 类似于append之于concat,join可以完成的操作merge也都可以完成,因此merge更加强大。
  • append和join存在的意义在于简洁和易用。
  • 最关键地,concat后面对于df的参数形式是objs,这个objs可以是一个列表或者集合,里面可以有很多个df;而merge后面跟的参数形式是left和right,只有两个df。因此concat其实可以快速实现多表的拼接,而merge只能实现两表的合并。

注意:append或即将被取消使用,因此df.append对于长期项目尽量不要使用