Pandas 重新索引(Reindexing),重新索引会更改DataFrame的行标签和列标签。重新索引意味着符合数据以匹配特定轴上的一组给定的标签。
可以通过索引来实现多个操作
- 重新排序现有数据以匹配一组新的标签。
- 在没有标签数据的标签位置插入缺失值(NA)标记。
import pandas as pd
import numpy as np
N=20
df = pd.DataFrame({
'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
'x': np.linspace(0,stop=N-1,num=N),
'y': np.random.rand(N),
'C': np.random.choice(['Low','Medium','High'],N).tolist(),
'D': np.random.normal(100, 10, size=(N)).tolist()
})
#reindex the DataFrame
df_reindexed = df.reindex(index=[0,2,5], columns=['A', 'C', 'B'])
print (df_reindexed)
执行结果如下:
A C B
0 2016-01-01 High NaN
2 2016-01-03 Low NaN
5 2016-01-06 High NaN
重建索引与其他对象对齐
有时可能希望采取一个对象和重新索引,其轴被标记为与另一个对象相同。 考虑下面的例子来理解这一点。
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(7,3),columns=['col1','col2','col3'])
df1 = df1.reindex_like(df2)
print (df1)
执行结果如下:
col1 col2 col3
0 1.676539 -0.552540 0.645143
1 -0.236950 1.511891 -1.146474
2 1.309760 1.340116 0.087754
3 -0.178481 -1.890487 -2.155115
4 0.793954 0.863209 0.508176
5 1.052597 -0.737787 -0.728498
6 -2.985211 0.243232 1.698845
注意 – 在这里,
df1
数据帧(DataFrame)被更改并重新编号,如df2
。 列名称应该匹配,否则将为整个列标签添加NAN
。
重建索引时的填充方法
reindex()
采用可选参数方法,它是一个填充方法,其值如下:
pad/ffill
– 向前填充值bfill/backfill
– 向后填充值nearest
– 从最近的索引值填充
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
# Padding NAN's
print (df2.reindex_like(df1))
# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill:")
print (df2.reindex_like(df1,method='ffill'))
执行结果如下:
col1 col2 col3
0 -1.028198 -0.611972 0.783637
1 -0.442691 -1.982359 -0.309824
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
Data Frame with Forward Fill:
col1 col2 col3
0 -1.028198 -0.611972 0.783637
1 -0.442691 -1.982359 -0.309824
2 -0.442691 -1.982359 -0.309824
3 -0.442691 -1.982359 -0.309824
4 -0.442691 -1.982359 -0.309824
5 -0.442691 -1.982359 -0.309824
注 – 最后四行被填充了。
重建索引时的填充限制
限制参数在重建索引时提供对填充的额外控制。限制指定连续匹配的最大计数。看看下面的例子来理解这个概念:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
# Padding NAN's
print (df2.reindex_like(df1))
# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill limiting to 1:")
print (df2.reindex_like(df1,method='ffill',limit=1))
执行结果如下:
col1 col2 col3
0 -0.225707 0.290531 0.568048
1 -0.267524 0.289223 1.531116
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
Data Frame with Forward Fill limiting to 1:
col1 col2 col3
0 -0.225707 0.290531 0.568048
1 -0.267524 0.289223 1.531116
2 -0.267524 0.289223 1.531116
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
注意 – 只有第
7
行由前6
行填充,然后,其它行按原样保留。
重命名
rename()
方法允许基于一些映射(字典或者Series
)或任意函数来重新标记一个轴。看看下面的例子来理解这一概念:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
print (df1)
print ("After renaming the rows and columns:")
print (df1.rename(columns={'col1' : 'c1', 'col2' : 'c2'},
index = {0 : 'apple', 1 : 'banana', 2 : 'durian'}))
执行结果如下:
col1 col2 col3
0 0.042511 -1.171527 -1.184469
1 -0.122663 0.591838 -0.719401
2 0.485293 0.149519 -1.060786
3 1.372260 2.142638 -0.264529
4 -1.000724 -0.945758 0.271191
5 1.303374 -1.950462 0.396237
After renaming the rows and columns:
c1 c2 col3
apple 0.042511 -1.171527 -1.184469
banana -0.122663 0.591838 -0.719401
durian 0.485293 0.149519 -1.060786
3 1.372260 2.142638 -0.264529
4 -1.000724 -0.945758 0.271191
5 1.303374 -1.950462 0.396237
rename()
方法提供了一个inplace
命名参数,默认为False
并复制底层数据。 指定传递inplace = True
则表示将数据重命名。