apply和applymap
- 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
- applymap:可以实现element-wise的python函数
例:格式化frame中的浮点数,变为string
format = lambda x: '%.2f' % x
frame.applymap(format)
- 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
说明:
- rank按值排序:在obj中,按值排序4和4的排名是第4名和第五名,取平均得4.5。7和7的排名分别是第六名和第七名,则其排名取平均得6.5。也就是说在按值排序的基础上,如果重复出现,平均排名给予rank。
- rank按观测排序:这里没有给0和2(指两个数字7)赋予average rank 6.5,而是给第一个看到的7(label 0)设置rank为6,第二个看到的7(label 2)设置rank为7。也就是说在按值排序的基础上,如果重复出现,按观测顺序依次给予rank。
- 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对于长期项目尽量不要使用