数据分析第三章pandas入门(二)

1.索引对象

frame2 = DataFrame(population, index=[2001, 2002])
frame2.index[0] = 2003
print(frame2.index)
TypeError: Index does not support mutable operations

index对象是不可修改的,即不能将index类型当作一个对象的方式来修改其中的值,要修改只能整体修改,即整体重新赋值

2.重新索引

from pandas import DataFrame,Series
import pandas as pd

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

a   -5.3
b    7.2
c    3.6
d    4.5
e    NaN

obj.index = ['a','b','c','d','e']会报错,目标的个数和索引个数不一致

另外,obj.reindex()是将obj复制了一个副本,在副本上进行操作,不影响obj本身

index和reindex的一个重大区别在于,整体改变index不会导致数值变为NaN,而reindex用法中,只要重新索引的索引号和之前的不一致,就会导致该行全是NaN,总结说来就是index只是改变整体的索引符号,而reindex是插入或者丢弃某些行

frame = DataFrame( np.arange(9).reshape((3,3)), index=['a', 'c', 'd'], columns=['nj', 'yz', 'bj'] )
print(frame)
frame4 = frame.reindex( index=['a', 'b', 'c', 'd'], columns=['nj', 'sh', 'bj'] )
frame4.index = ['0', '1', '2', '3']  #index不会产生副本,直接在原数据上操作
print(frame4)

   nj  yz  bj
a   0   1   2
c   3   4   5

d   6   7   8

相当于插入了b行和'sh'列,将'yz'列舍弃了,插入的行和列都是NaN

    nj  sh   bj
a  0.0 NaN  2.0
b  NaN NaN  NaN
c  3.0 NaN  5.0

d  6.0 NaN  8.0

使用index的方法只是改变索引,不会影响数值

    nj  sh   bj
0  0.0 NaN  2.0
1  NaN NaN  NaN
2  3.0 NaN  5.0
3  6.0 NaN  8.0


obj2 = obj.reindex( ['a', 'b', 'c', 'd', 'e'], fill_value=0 )   #替换NaN的值
print(obj2)
a   -5.3
b    7.2
c    3.6
d    4.5

e    0.0

from pandas import DataFrame,Series
import pandas as pd

obj = Series( ['blue', 'purple', 'yellow'], index=[0, 2, 4] )
print(obj)
obj2 = obj.reindex( range(6), method='ffill' )
print(obj2)

向前填充,即若后一位是NaN,则用上一个值填充

0      blue
2    purple

4    yellow

填充后:

0      blue
1      blue
2    purple
3    purple
4    yellow
5    yellow

import numpy as np
from pandas import DataFrame,Series
import pandas as pd

frame = DataFrame( np.arange(9).reshape((3,3)), index=['a', 'c', 'd'], columns=['nj', 'yz', 'bj'] )
print(frame)
frame2 = frame.reindex( ['a', 'b', 'c', 'd'] )
print(frame2)
frame3 = frame.reindex( columns=['nj', 'sh', 'bj'] )
print(frame3)
   nj  yz  bj
a   0   1   2
c   3   4   5

d   6   7   8

在DataFrame中,重新索引并且没有指明是index还是columns,则默认是index

    nj   yz   bj
a  0.0  1.0  2.0
b  NaN  NaN  NaN
c  3.0  4.0  5.0

d  6.0  7.0  8.0

对columns进行重新索引后:

   nj  sh  bj
a   0 NaN   2
c   3 NaN   5

d   6 NaN   8

对DataFranme使用method:

frame = DataFrame( np.arange(9).reshape((3,3)), index=['a', 'c', 'd'], columns=['nj', 'yz', 'bj'] )
print(frame)
frame2 = frame.reindex( ['a', 'b', 'c', 'd'], method='ffill' )
print(frame2)
   nj  yz  bj
a   0   1   2
c   3   4   5

d   6   7   8

ffill只能在行进行,不能在列进行,且如果出现将NaN向前填充就会报错

   nj  yz  bj
a   0   1   2
b   0   1   2
c   3   4   5

d   6   7   8

3.丢弃指定轴上的项

obj = Series( np.arange(5), index=['a', 'b', 'c', 'd', 'e'] )
new_obj = obj.drop('c')
print(obj)
print(new_obj)
a    0
b    1
c    2
d    3
e    4
dtype: int32
a    0
b    1
d    3
e    4

dtype: int32

发现原数据没变,所以只是在产生了一个副本并在副本上操作

new_obj = obj.drop(['d', 'c'])

丢弃多个需要用[]符号,不实用会报错

对DataFrame:

frame = DataFrame( np.arange(16).reshape((4,4)), index=['a','b','c','d'], columns=['yz','nj','sz','wx'] )
print(frame)
frame2 = frame.drop(['a','b'])   #默认axis=0,0是行
print(frame2)
frame3 = frame.drop(['sz', 'wx'], axis=1)  #1是列
print(frame3)

4.索引,选取和过滤

Series索引:

obj = Series( np.arange(4), index=['a', 'b', 'c', 'd'] )
print(obj['b'])
print(obj[1])

print(obj[['b', 'a']])
print(obj[[1, 0]])

print(obj[:2])
print(obj[obj < 2])

需要注意的是,如果直接利用index进行切片,那末端是包含的:

print(obj[ 'b':'c' ])
b    1

c    2

DataFrame索引:

DataFrame索引正常情况下是对列进行索引,而且只能用常规方法,不能像Series一样使用数字,也不可以使用类似

frame[ 'yz':'sz' ]这样的切片

frame = DataFrame( np.arange(16).reshape((4,4)), index=['a','b','c','d'], columns=['yz','nj','sz','wx'] )
print(frame)
print(frame[ ['nj', 'yz'] ])

对DataFrame,可以使用切片方式选取行,必须是切片方式

print(frame[0:1])  #不能写成frame[0]
   yz  nj  sz  wx
a   0   1   2   3


还可以利用对列的筛选来选取行:

print(frame[ frame['yz'] > 0 ])
   yz  nj  sz  wx
b   4   5   6   7
c   8   9  10  11

d  12  13  14  15

使用ix选取行和列的子集:

frame = DataFrame( np.arange(16).reshape((4,4)), index=['a','b','c','d'], columns=['yz','nj','sz','wx'] )
print(frame.ix[ ['a','b'], ['yz', 'nj'] ])
   yz  nj
a   0   1

b   4   5

也可以:

print(frame.ix[ ['c', 'a'], [3,0,1] ])
   wx  yz  nj
c  11   8   9

a   3   0   1

也可以:

print(frame.ix[ [0,1], [3,0,1] ])
   wx  yz  nj
a   3   0   1

b   7   4   5

总之ix的用法和Series类似,用法比较随意,没有太多限制,更加好用

print(frame.ix[ [0,1] ]) #选取前2行
print(frame.ix[0:2]) #选取前2行
print(frame.ix['a':'b']) #选取前2行
print(frame.ix['a':'b', 'yz':'nj'])  #选取前两行前两列
print(frame.ix[ 0:2, 0:2 ]) #选取前两行前两列
print(frame.ix[ frame['yz'] > 0, :3 ])
   yz  nj  sz
b   4   5   6
c   8   9  10

d  12  13  14









猜你喜欢

转载自blog.csdn.net/xiaobaicai4552/article/details/80017450