pandas(二)函数应用和映射详解大数据

NumPy的ufuncs也可以操作pandas对象

>>> frame 
   one  two  three  four 
a    0    1      2     3 
b    4    5      6     7 
c    8    9     10    11 
d   12   13     14    15 
>>> np.square(frame)#求平方 
   one  two  three  four 
a    0    1      4     9 
b   16   25     36    49 
c   64   81    100   121 
d  144  169    196   225 
>>>

用DataFrame的apply方法,可以将函数应用到由各列或行所形成的一维数组中。

>>> frame 
   one  two  three  four 
a    0    1      2     3 
b    4    5      6     7 
c    8    9     10    11 
d   12   13     14    15 
>>> func = lambda x : x.max()-x.min() 
>>> frame.apply(func) 
one      12 
two      12 
three    12 
four     12 
dtype: int64 
>>> frame.apply(func,axis = 1) 
a    3 
b    3 
c    3 
d    3 
dtype: int64

用DataFrame的applymap方法,可以将函数应用到元素级的数据上。

>>> f = lambda x : x+1 
>>> frame 
   one  two  three  four 
a    0    1      2     3 
b    4    5      6     7 
c    8    9     10    11 
d   12   13     14    15 
>>> frame.applymap(f) 
   one  two  three  four 
a    1    2      3     4 
b    5    6      7     8 
c    9   10     11    12 
d   13   14     15    16

Series也有一个元素级函数应用的方法map

>>> frame['one'] #获取dataframe的列为一个Series对象 
a     0 
b     4 
c     8 
d    12 
Name: one, dtype: int32 
>>> frame['one'].map(f) 
a     1 
b     5 
c     9 
d    13 
Name: one, dtype: int64 
>>>

排序和排名

用sort_index对行或列进行排序,返回一个排序好的新对象

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

>>> new_obj = obj.sort_index(ascending = False)#默认是升序,通过参数ascending可以设置降序
>>> new_obj
d 0
c 3
b 1
a 2
dtype: int64

对于DataFrame可以根据任意轴进行排序

>>> frame = DataFrame(np.random.randn(4,4),columns = ['c','a','d','b'],index=[3,1,4,2]) 
>>> frame 
          c         a         d         b 
3  0.004950 -1.272352  1.050491  0.823530 
1  1.198348  0.647114  0.154131 -0.636497 
4 -0.358309  0.525307 -1.868459  0.867197 
2 -0.021764  0.140501  1.459700 -0.090884 
>>> frame.sort_index() 
          c         a         d         b 
1  1.198348  0.647114  0.154131 -0.636497 
2 -0.021764  0.140501  1.459700 -0.090884 
3  0.004950 -1.272352  1.050491  0.823530 
4 -0.358309  0.525307 -1.868459  0.867197 
>>> frame.sort_index(axis =1) 
          a         b         c         d 
3 -1.272352  0.823530  0.004950  1.050491 
1  0.647114 -0.636497  1.198348  0.154131 
4  0.525307  0.867197 -0.358309 -1.868459 
2  0.140501 -0.090884 -0.021764  1.459700

除了按照索引排序之外,还可以按照值排序

按值对Series进行排序的时候,用sort_values方法。在老版本中是order方法。

>>> obj = Series([3,4,1,6]) 
>>> obj 
0    3 
1    4 
2    1 
3    6 
dtype: int64 
>>> obj.sort_values() 
2    1 
0    3 
1    4 
3    6 
dtype: int64

在排序时,缺失值会默认放到末尾。

在DataFrame中,可能希望按照一个或多个列中的值进行排序

>>> frame = DataFrame({'a':[4,7,-3,2],'b':[1,0,0,1]}) 
>>> frame 
   a  b 
0  4  1 
1  7  0 
2 -3  0 
3  2  1 
>>> frame.sort_index(by='a')#这个方法将在不久之后废弃,可以使用sort_values方法 
__main__:1: FutureWarning: by argument to sort_index is deprecated, please use .sort_values(by=...) 
   a  b 
2 -3  0 
3  2  1 
0  4  1 
1  7  0 
>>> frame.sort_values(by='a') 
   a  b 
2 -3  0 
3  2  1 
0  4  1 
1  7  0 
>>>

根据多个列排序

>>> frame.sort_values(by=['b','a']) 
   a  b 
2 -3  0 
1  7  0 
3  2  1 
0  4  1

 

排名跟排序有紧密的联系,首先根据值排序,然后增设一个排名值(从1开始,直到有效值的数量。如果两个值相等,都取两个排名的均值)

>>> obj = Series([7,-5,7,4,2,0,4]) 
>>> obj 
0    7 
1   -5 
2    7 
3    4 
4    2 
5    0 
6    4 
dtype: int64 
>>> 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 
>>>

也可以根据值在原来数据中出现的顺序,进行排名。如果某几个值相等,现在数据中出现的排名靠前,这需要借助于method选项

>>> 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

当然也支持降序排列,ascending=False即可

dataframe对象默认按照行排名,设置轴选项axis=1,就会按照列排名

method选项的值有

method 说明
average 默认:在相等分组中,为各个值分配平均排名
mix     使用整个分组的最大排名
min 使用整个分组的最小排名
first 按照值在原始数据中出现的顺序分配排名

 

带有重复值的轴索引

许多pandas函数需要标签唯一,但这并不是强制性的。

可以通过索引的is_unique去判断是否唯一

>>> obj =Series(range(5),index=['a','a','b','b','c']) 
>>> obj 
a    0 
a    1 
b    2 
b    3 
c    4 
dtype: int64

>>> obj.index.is_unique
False

 

带有重复值索引,数据的选取时,如果索引对应多个值,返回一个Series,否则返回单个值

>>> obj['a'] 
a    0 
a    1 
dtype: int64 
>>> obj['c'] 
4

对于DataFrame也是如此

如果索引对应多行,返回的依然是一个dataframe对象,否则是一个Series对象

>>> df = DataFrame(np.random.randn(5,3),index=['a','a','b','b','c']) 
>>> df.ix['a'] 
          0         1         2 
a -0.757846  0.713964 -0.674956 
a  0.198044  1.093223 -0.342281 
>>> df.ix['c'] 
0   -2.647372 
1   -0.526367 
2   -0.296859 
Name: c, dtype: float64 
>>> type(df.ix['a']) 
<class 'pandas.core.frame.DataFrame'> 
>>> type(df.ix['c']) 
<class 'pandas.core.series.Series'>

 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/9220.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论