利用python进行数据分析-06-pandas-基本功能

1、重新索引

obj = pd.Series([4.5,7.2,-5.3,3.6],index = ['d','b','a','c'])

obj
Out[41]: 
d    4.5
b    7.2
a   -5.3
c    3.6
dtype: float64

obj2 = obj.reindex(['a','b','c','d','e'])

obj2
Out[43]: 
a   -5.3
b    7.2
c    3.6
d    4.5
e    NaN
dtype: float64

obj.reindex(['a','b','c','d','e'],fill_value = 0)
Out[44]: 
a   -5.3
b    7.2
c    3.6
d    4.5
e    0.0
dtype: float64

可以利用reindex进行重新索引,其中如果没有索引将会进行缺失值进行填充。其中可以以fill_value进行默认赋值

 

对于已经确认的Series,可以通过ffill进行向前填充:

obj3 = pd.Series(['blue','purple','yellow'],index = [0,2,4])

obj3.reindex(range(6),method = 'ffill')
Out[50]: 
0      blue
1      blue
2    purple
3    purple
4    yellow
5    yellow
dtype: object

ffill 或 pad    前向填充(或搬运)值

bfill 或 backfill    后向填充(或搬运)值

frame = pd.DataFrame(np.arange(9).reshape((3,3)),index = ['a','c','d'],columns = ['Ohio','Texas','California'])  #reshape 重新将数组调整成m*n矩阵的格式

frame
Out[55]: 
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

feame2 = frame.reindex(['a','b','c','d'])

feame2
Out[57]: 
   Ohio  Texas  California
a     0      1           2
b   NaN    NaN         NaN
c     3      4           5
d     6      7           8

重新索引用reindex:

state = ['Texas','Utah','California']

frame.reindex(index = ['a','b','c','d'],method = 'ffill',columns = state)
Out[65]: 
   Texas  Utah  California
a      1   NaN           2
b      1   NaN           2
c      4   NaN           5
d      7   NaN           8frame.ix[['a','b','c','d'],state]     #采用ix标签索引功能,从新索引将会更加简单
Out[66]: 
   Texas  Utah  California
a      1   NaN           2
b    NaN   NaN         NaN
c      4   NaN           5
d      7   NaN           8

image

2、丢弃指定轴上的项

drop方法返回的是一个在指定轴上的删除了制定值得新对象:

obj =pd.Series(np.arange(5.),index = ['a','b','c','d','e'])

new_obj = obj.drop('c')

new_obj
Out[69]: 
a    0
b    1
d    3
e    4
dtype: float64

obj.drop(['d','c'])
Out[70]: 
a    0
b    1
e    4
dtype: float64

3、索引、选取和过滤

obj = pd.Series(np.arange(4.0),index = ['a','b','c','d'])

obj
Out[72]: 
a    0
b    1
c    2
d    3
dtype: float64

obj[2:4]
Out[73]: 
c    2
d    3
dtype: float64

obj[1:2]
Out[74]: 
b    1
dtype: float64

利用标签的切片是运算和普通的python切片运算是不一样的,其末端是包含的(inclusive):

obj['b':'c']
Out[76]: 
b    1
c    2
dtype: float64

利用索引字段ix进行索引选择:

data
Out[4]: 
          one  two  three  four
Ohio        0    1      2     3
Colorado    4    5      6     7
Utah        8    9     10    11
New York   12   13     14    15

data.ix['Colorado',['two','three']]
Out[5]: 
two      5
three    6
Name: Colorado, dtype: int32

data.ix[['Colorado','Utah'],[3,0,1]]
Out[6]: 
          four  one  two
Colorado     7    4    5
Utah        11    8    9

data.ix[2]
Out[7]: 
one       8
two       9
three    10
four     11
Name: Utah, dtype: int32

data.ix[:'Utah','two']
Out[8]: 
Ohio        1
Colorado    5
Utah        9
Name: two, dtype: int32

data.ix[data.three > 5,:3]
Out[9]: 
          one  two  three
Colorado    4    5      6
Utah        8    9     10
New York   12   13     14

image

image

4、算数运算和数据对齐

对不同索引的对象进行算数运算,如果对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集

s1 = pd.Series([7.3,-2.5,3.4,1.5],index = ['a','c','d','e'])

s2 = pd.Series([-2.1,3.6,-1.5,4,3.1],index = ['a','c','e','f','g'])

s1
Out[12]: 
a    7.3
c   -2.5
d    3.4
e    1.5
dtype: float64

s2
Out[13]: 
a   -2.1
c    3.6
e   -1.5
f    4.0
g    3.1
dtype: float64

s1+s2
Out[14]: 
a    5.2
c    1.1
d    NaN
e    0.0
f    NaN
g    NaN
dtype: float64

自动的数据对齐操作在不重叠的所引处引入了NA值,缺失值会在算数值中传播。

两个数值进行运算时,如果其中一个对象中某个轴标签在另一个对象中找不到时填充一个特殊值(比如0)

df1 = pd.DataFrame(np.arange(12.).reshape((3,4)),columns = list('abcd'))    #可进行list创建数组

df2 = pd.DataFrame(np.arange(20.).reshape((4,5)),columns = list('abcde'))

df1
Out[18]: 
   a  b   c   d
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

df2
Out[19]: 
    a   b   c   d   e
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14
3  15  16  17  18  19

df1.add(df2,fill_value = 0)
Out[20]: 
    a   b   c   d   e
0   0   2   4   6   4
1   9  11  13  15   9
2  18  20  22  24  14
3  15  16  17  18  19
在对Series或DataFrame重新索引时,也可以指定一个填充值
df1.reindex(columns = df2.columns,fill_value = 0)
Out[21]: 
   a  b   c   d  e
0  0  1   2   3  0
1  4  5   6   7  0
2  8  9  10  11  0

add 用于加法                   sub用于减法                 div用于除法                   mul用于乘法

5、用于DataFrame和Series之间的运算

arr = np.arange(12.).reshape((3,4))

arr
Out[23]: 
array([[  0.,   1.,   2.,   3.],
       [  4.,   5.,   6.,   7.],
       [  8.,   9.,  10.,  11.]])

arr[0]
Out[24]: array([ 0.,  1.,  2.,  3.])

arr-arr[0]
Out[25]: 
array([[ 0.,  0.,  0.,  0.],
       [ 4.,  4.,  4.,  4.],
       [ 8.,  8.,  8.,  8.]])

6、函数应用和映射

frame
Out[30]: 
               b         d         e
Utah    0.126339 -1.371416  0.971039
Ohio    0.325697 -1.110609  1.177894
Texas   0.114226 -1.359126 -0.323779
OREGON  1.015949  0.904341  1.275054

np.abs(frame)
Out[31]: 
               b         d         e
Utah    0.126339  1.371416  0.971039
Ohio    0.325697  1.110609  1.177894
Texas   0.114226  1.359126  0.323779
OREGON  1.015949  0.904341  1.275054

f=lambda x: x.max() - x.min()    
#lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。如f表示极差函数。
frame.apply(f)
Out[33]: 
b    0.901723
d    2.275758
e    1.598833
dtype: float64

frame.apply(f,axis =1)
Out[34]: 
Utah      2.342456
Ohio      2.288503
Texas     1.473352
OREGON    0.370713
dtype: float64

传递给apply的值还可以返回由多个值组成的Series:

def f(x):
    return pd.Series([x.min(),x.max()],index = ['min','max'])
frame.apply(f)
Out[40]: 
            b         d         e
min  0.114226 -1.371416 -0.323779
max  1.015949  0.904341  1.275054

元素级的python函数也是可以使用的,假如frame中的各个浮点值的格式化字符串,可使用applymap即可:

format = lambda x: '%.2f' % x

frame.applymap(format)
Out[42]: 
           b      d      e
Utah    0.13  -1.37   0.97
Ohio    0.33  -1.11   1.18
Texas   0.11  -1.36  -0.32
OREGON  1.02   0.90   1.28

之所以叫做applymap,是因为Series有一个应用元素级函数的map方法:

frame['e'].map(format)
Out[44]: 
Utah       0.97
Ohio       1.18
Texas     -0.32
OREGON     1.28
Name: e, dtype: object

7、排序和排名

DataFrame对轴索引进行排序:sort_index()       x.sort_index(axis =1,ascending = False)

Series对值进行排序:order()

Dataframe对值进行排序:sort_index(by = [‘a’,’b’])    #对a,b列进行排序,

rank排序:

Series:会增设一个排名值

默认情况下,rank是通过“为各组分配一个平均排名”的方式来破坏平级关系的。

两个4共同排名第四,两则均取4.5,

obj = pd.Series([7,-5,7,4,2,0,4])

obj.rank()
Out[50]: 
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')  #可知原数据中-5是第一小的,故索引为1的位置显示为1,其中索引为3的值4排第四,索引为6的值4排第五
Out[52]: 
0    6
1    1
2    7
3    4
4    3
5    2
6    5
dtype: float64

image

8、带有重复值的轴索引

obj = pd.Series(range(5),index = ['a','a','b','b','c'])

obj
Out[54]: 
a    0
a    1
b    2
b    3
c    4
dtype: int32

obj.index.is_unique    #is_unique 进行检查索引是否唯一
Out[55]: False

obj['a']  #如果索引对应多个值,则返回一个Series,若对应一个值,则返回一个标量值
Out[56]: 
a    0
a    1
dtype: int32

对DataFrame的行进行索引时也是如此。

posted @ 2015-11-04 18:28  Groupe  阅读(313)  评论(0编辑  收藏  举报