pandas入门:函数应用和映射,排序和排名,含有重复标签的轴索引

函数应用和映射

numpy 的通用函数(逐元素数组方法)对pandas 同样有效。通用函数 脑补链接

frame = pd.DataFrame(np.random.randn(4,3),columns=list('bde'),index=['utah','ohio','texas','oregon'])
frame

           b	d	e
utah	-0.794479	-0.739367	-0.965423
ohio	-0.657556	-1.990293	0.732611
texas	0.493048	1.346761	-0.890091
oregon	-0.590841	0.785932	0.707483

np.abs(frame)
	           b	d	e
utah	0.794479	0.739367	0.965423
ohio	0.657556	1.990293	0.732611
texas	0.493048	1.346761	0.890091
oregon	0.590841	0.785932	0.707483


# 将函数应用到一行或一列的一维数组上,使用 apply 这个功能。
f=lambda x : x.max() - x.min()    # 获得最大最小值的差值
frame.apply(f)        # 每一列都会调用一次
b    1.287527
d    3.337054
e    1.698034
dtype: float64

frame.apply(f,axis='columns')     # 对每行调用一次,,这个axis 就很迷,,,匹配列,对行调用。。。

# 大部分最常用的数组统计(比如sum mean) 都是dataframe 的方法,所以计算统计值时使用apply 并不是必须的

# 传递给apply 的函数并不一定要返回一个标量值,也可以返回带有多个值的 series 
def f(x):
    return pd.Series([x.min(),x.max()],index=['min','max'])
frame.apply(f)           # 额,,有点搞不清这是对列还是对行了。。。
	   b	d	e
min	-0.794479	-1.990293	-0.965423
max	0.493048	1.346761	0.732611


# 逐元素的python 函数也可以使用,applymap() 方法
format=lambda x:'%.2f' % x     # 格式化成两位小数
frame.applymap(format)
	           b	d	e
utah	-0.79	-0.74	-0.97
ohio	-0.66	-1.99	0.73
texas	0.49	1.35	-0.89
oregon	-0.59	0.79	0.71

# series 也有个 map 函数,用来将一个逐元素的函数应用到 series 上
frame['e'].map(format)
utah      -0.97
ohio       0.73
texas     -0.89
oregon     0.71
Name: e, dtype: object        # 以上这些方法都不会修改原对象 frame 的

排序和排名

根据某些准则对数据集进行排序时另一个重要的内建操作,如需按行或列索引进行字典型排序,需要使用 sort_index 方法,该方法返回一个新的、排序好的对象。

obj=pd.Series(range(4),index=['d','a','b','c'])
obj.sort_index()
a    1
b    2
c    3
d    0
dtype: int64

frame=pd.DataFrame(np.arange(8).reshape((2,4)),index=['three','one'],columns=['d','a','b','c'])
frame.sort_index()
	d	a	b	c
one	4	5	6	7
three	0	1	2	3

frame.sort_index(axis=1,ascending=False)   # 默认时升序,ascending 调成降序
	d	c	b	a
three	0	3	2	1
one	4	7	6	5


obj=pd.Series([4,7,np.nan,-3,2])
obj.sort_values()          # 对值进行排序,默认情况下,nan 会排到最后
3   -3.0
4    2.0
0    4.0
1    7.0
2    NaN
dtype: float64


# 当对dataframe 排序时,要传递 by 这个参数,可以使用一列或多列作为排序键。
frame=pd.DataFrame({'b':[4,7,-3,2],'a':[0,9,5,3],'c':[6,9,3,2]})
frame
   b	a	c
0	4	0	6
1	7	9	9
2	-3	5	3
3	2	3	2

frame.sort_values(by=['a','b']) # 传递 by 这个参数就行,注意传递多个以第一个的索引为准,这里b 就没排好
   b	a	c
0	4	0	6
3	2	3	2
2	-3	5	3
1	7	9	9

排名是指对数组从1到有效数据点总数分配名次的操作。series 和 dataframe 的rank 方法时实现排名的,默认情况下,rank 通过将平均排名分配到每个组来打破平级关系。

obj=pd.Series([7,-5,7,4,2,0,4])
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

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

obj.rank(method='max',ascending=False) # 将值分配给组中的最大排名。。。怎么这么讲究。。。
0    2.0
1    7.0
2    2.0         
3    4.0
4    5.0
5    6.0
6    4.0
dtype: float64

frame=pd.DataFrame({'b':[4.3,7,-3,2],'a':[0,1,0,1],'c':[-2,5,8,-2.5]})
frame
   b	a	c
0	4.3	0	-2.0
1	7.0	1	5.0
2	-3.0	0	8.0
3	2.0	1	-2.5

frame.rank(axis='columns')
	b	a	c
0	3.0	2.0	1.0
1	3.0	1.0	2.0
2	1.0	2.0	3.0
3	3.0	2.0	1.0

在这里插入图片描述

含有重复标签的轴索引

frame=pd.DataFrame(np.arange(12).reshape((3,4)),index=['three','one','three'],columns=['d','a','b','c'])
frame.loc['three']
	d	a	b	c
three	0	1	2	3
three	8	9	10	11

就是对于重复标签的索引会都提出来。。。这个索引真是给我整蒙了。。。。

猜你喜欢

转载自blog.csdn.net/weixin_46192930/article/details/106476666