1.**reindex()**表示重新索引,如果某个索引值当前不存在,就会引入
缺失值;可以通过fill_value参数填充默认值,也可以通过method参数设置填充方法;
reindex方法的methon参数的选项:
ffill或pad 前向填充值
bfill或backfill 后向填充值
或者是fill_value直接指定缺失值为多少
例子:
import pandas as pd
import numpy as np
data=pd.DataFrame(np.random.randn(4,3),columns=['a','b','c'],index=['a','b','c','d'])
data
结果:
a b c
a 1.138053 2.017905 -1.007555
b 0.491705 -0.689641 0.955129
c 0.148272 1.493732 -0.211838
d -0.619931 1.650868 1.794933
用reindex方法重新索引
data.reindex(['b','c','d','e','a'])
结果
a b c
b 0.491705 -0.689641 0.955129
c 0.148272 1.493732 -0.211838
d -0.619931 1.650868 1.794933
e NaN NaN NaN
a 1.138053 2.017905 -1.007555
用method方法设置缺失值
data.reindex(['b','c','d','e','a'],method='ffill')
结果:
a b c
b 0.491705 -0.689641 0.955129
c 0.148272 1.493732 -0.211838
d -0.619931 1.650868 1.794933
e -0.619931 1.650868 1.794933
a 1.138053 2.017905 -1.007555
也可以对列进行reindex
data.reindex(columns=['b','c','d','e','a'])
#或者如下
data.reindex(['b','c','d','e','a'],axis='columns')
结果:
b c d e a
a 2.017905 -1.007555 NaN NaN 1.138053
b -0.689641 0.955129 NaN NaN 0.491705
c 1.493732 -0.211838 NaN NaN 0.148272
d 1.650868 1.794933 NaN NaN -0.619931
对于缺失值的处理可以用同样的method或者是fill_value填充缺失值。
对于Series的reindex的处理方式也是一样的。
s=pd.Series(np.arange(0,6),index=[np.arange(1,7)])
s.reindex([2,5,6,9,10,3])
s.reindex([2,5,6,9,10,3],method='bfill')
思路是一样的。
2. 我们再来看看DataFrame.set_index,DataFrame.reset_index,DataFrame.reindex_like的用法。
(1)DataFrame.set_index设置行标签,表示用已经存在的列或者是数组设置行标签。
例子:
df = pd.DataFrame({'month': [1, 4, 7, 10],
'year': [2012, 2014, 2013, 2014],
'sale': [55, 40, 84, 31]})
df
结果:
month sale year
0 1 55 2012
1 4 40 2014
2 7 84 2013
3 10 31 2014
在执行:
df.set_index(['month','year'])
结果:
sale
month year
1 2012 55
4 2014 40
7 2013 84
10 2014 31
或者:
s = pd.Series([1, 2, 3, 4])
df.set_index([s, s**2])
结果:
month sale year
1 1 1 55 2012
2 4 4 40 2014
3 9 7 84 2013
4 16 10 31 2014
(2)DataFrame.reset_index
reset_index可以还原索引,重新变为默认的整型索引
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=”)
level控制了具体要还原的那个等级的索引
drop为False则索引列会被还原为普通列,否则会丢失
例子:
df = pd.DataFrame([('bird', 389.0),
('bird', 24.0),
('mammal', 80.5),
('mammal', np.nan)],
index=['falcon', 'parrot', 'lion', 'monkey'],
columns=('class', 'max_speed'))
df
结果:``
class max_speed
falcon bird 389.0
parrot bird 24.0
lion mammal 80.5
monkey mammal NaN
接着:
df.reset_index()#当reset_index()执行时,原来的index会增加到dataframe中的一列
结果:
index class max_speed
0 falcon bird 389.0
1 parrot bird 24.0
2 lion mammal 80.5
3 monkey mammal NaN
再有:
df.reset_index(drop=True)#表示将原来的index列删除
结果:
class max_speed
0 bird 389.0
1 bird 24.0
2 mammal 80.5
3 mammal NaN
对于多层的index的dataframe可以参考官方文档pandas官网
(3)DataFrame.reindex_like,返回与其他对象具有匹配索引的对象。
例子:
df1 = pd.DataFrame([[24.3, 75.7, 'high'],
[31, 87.8, 'high'],
[22, 71.6, 'medium'],
[35, 95, 'medium']],
columns=['temp_celsius', 'temp_fahrenheit', 'windspeed'],
index=pd.date_range(start='2014-02-12',
end='2014-02-15', freq='D'))
df1
结果:
temp_celsius temp_fahrenheit windspeed
2014-02-12 24.3 75.7 high
2014-02-13 31.0 87.8 high
2014-02-14 22.0 71.6 medium
2014-02-15 35.0 95.0 medium
df2 = pd.DataFrame([[28, 'low'],
[30, 'low'],
[35.1, 'medium']],
columns=['temp_celsius', 'windspeed'],
index=pd.DatetimeIndex(['2014-02-12', '2014-02-13',
'2014-02-15']))
df2
结果:
temp_celsius windspeed
2014-02-12 28.0 low
2014-02-13 30.0 low
2014-02-15 35.1 medium
执行:
df2.reindex_like(df1)
结果:
temp_celsius temp_fahrenheit windspeed
2014-02-12 28.0 NaN low
2014-02-13 30.0 NaN low
2014-02-14 NaN NaN NaN
2014-02-15 35.1 NaN medium
注意在结果中的索引值以及列都与df1匹配,对于df2中不存在就显示缺失值。