开发者学堂课程【高校精品课-华东师范大学 - Python 数据科学基础与实践:Pandas 基础5】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1067/detail/15385
Pandas 基础5
element-wise的python函数也能用。假设想要格式化frame中的浮点数,变为string。可以用apply map:
In [70]: format = lambda x: '%.2f’%x
In [71]: frame.applymap(format)
0ut[71]:
d d e
Utah 1.08 0.74 1.30
ohio 0.47 -1.19 0.89
Texas 1.06 0.03 1.99
Oregon 0.59 0.76 0.07
先做一个lambda函数,然后applymap引用这个函数,然后里面的值就变成保留两位的字符串了。
applymap的做法是,series有一个map函数,能用来实现element-wise函数:
In [72]: frame['e'].map(format)
out[72]: Utah 1.30
0hio 0.89
Texas 1.99
Oregon 0.07
Name: e,dtype: object
Sorting and Ranking(排序)
按row或column index来排序的话,可以用sort_index方法,会返回一个新的object:
In [73]: obj = pd.Series(range(4), index=['d', 'a', 'b', 'c'])
Obj
out[73]: d 0
a 1
b 2
c 3
dtype: int64
In[74]: obj.sort_index() 给索引进行排序,默认是升序。
out[74]: a 1
b 2
c 3
d 0
dtype: int64
在DataFrame,可以用index或其他axis来排序:
In [75]:frame = pd. DataFrame(np. arange(8).reshape((2,4)),
index=['three', 'one’],
columns=['d', 'a', 'b', 'c'])
frame
Out[75]: d a b c
three 0 1 2 3
one 4 5 6 7
In [76]: frame.sort_index() 对行进行索引
0ut[76]: d a b c
one 4 5 6 7
three 0 1 2 3
In [77]: frame.sort_index(axis=1) 对列进行索引
Out[77]: a b c d
three 1 2 3 0
one 5 6 7 4
默认是升序,可以设置降序:
升序等于false,说明是降序排列。
In[78]: frame.sort_index(axis=1,ascending False)
Out[78]:
d c b a
three 0 3 2 1
one 4 7 6 5
通过值来排序,用sort_values方法:
In [80]: obj = pd.Series([4,7,-3,2])
obj.sort_values()
out[80]: 2 -3
3 2
0 4
1 7
dtype: int64
缺失值会被排在最后:
In[82]: obj = pd.Series([4,np.nan,7,np.nan,-3,2])
obj.sort_values()
Out[82]: 4 -3.0
5 2.0
0 4.0
2 7.0
1 NaN
3 NaN
dtype: float64
对于一个DataFrame,可以用一列或多列作为sort keys。这样的话,只需要把一列多多列的名字导入到sort_values即可;
In [83]: frame = pd.DataFrame({'b': [4,7,—3,2], 'a': [0, 1,0,1]})
Frame
Out[83]:
b a
0 4 0
1 7 1
2 -3 0
3 2 1
In [84]: frame.sort_values(by=' b')
Out[84]:
b a
2 -3 0
3 2 1
0 4 0
1 7 1
多列排序的话,传入一个list of names:
In [85]: frame.sort_values(by=['a', 'b'])
Out[85]:
b a
2 -3 0
0 4 0
3 2 1
1 7 1
下面学习ranking,ranking及既是等级又是排名。
ranking (排名)是给有效的数据分配数字。rank方法能用于series和DataFrame,rank方法默认会给每个group一个meanrank (平均排名)。rank表示在这个数在原来的Series中排第几名,有相同的数,取其排名平均(默认)作为值:
In [86]: obj = pd.Series([,7,—5,7,4,2,0,4])
obj
out[86]: 0 7
1 -5
2 7
3 4
4 2
5 0
6 4
dtype: int64
In [90]: obj.sort_values()
out[90]: 1 -5
5 0
4 2
3 4
6 4
0 7
2 7
dtype: int64
[91]: obj.rank()
[91]: 0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
dtype: float64
在obj中,4和4的排名是第4名和第五名,取平均得4.5。7和7的排名分别是第六名和第七名,则其排名取平均得6.5。其他同理可得。
rank也可以根据数据被观测到的顺序来设定:
In[92]: obj
0ut[92]: 0 7
1 -5
2 7
3 4
4 2
5 0
6 4
In []: obj.rank(method='first')
out[]: 0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
这里没有给0和2(指两个数字7)赋予average rank 6.5,而是给第一个看到的7(label 0)设置rank为6,第二个看到的7(label 2)设置rank为7。
也可以设置降序:
In [96]: # Assign tie values the maximum rank in the group
obj.rank(ascending False,method='max')
注意:原来rank为1的最小,现在这里rank为1的变为最大了。
Out[96]: 0 2.0
1 7.0
2 2.0
3 4.0
4 5.0
5 6.0
6 4.0
dtype: float64
dataframe可以根据行或列来计算rank:
In[97]: frame = pd.DataFrame({'b': [4.3,7,-3,2],
'a': [0, 1,0,11],
'c'∶ [-2,5,8,-2.5]})
Frame
Out[97]:
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
In[98]: frame. rank (axis='columns')
# columns表示列与列之间的排序(即每一行里数据间的排序)
out[98]:
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
执行之后要注意,out[98]里每一列都是rank,它里面是rank的位置。