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 bja 0.0 NaN 2.0
b NaN NaN NaN
c 3.0 NaN 5.0
d 6.0 NaN 8.0
使用index的方法只是改变索引,不会影响数值
nj sh bj0 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 bja 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