扫码一下
查看教程更方便
重新索引会更改 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()
})
print("dataframe data: ")
print(df)
# 对 dataframe 重新索引
df_reindexed = df.reindex(index=[0,2,5], columns=['a', 'c', 'b'])
print("indexed data: ")
print(df_reindexed)
运行结果如下
dataframe data:
a x y c d
0 2016-01-01 0.0 0.155407 medium 104.220229
1 2016-01-02 1.0 0.875641 medium 99.992422
2 2016-01-03 2.0 0.834197 low 107.589845
3 2016-01-04 3.0 0.624475 low 81.096882
4 2016-01-05 4.0 0.480847 high 110.392042
5 2016-01-06 5.0 0.334496 medium 97.816051
6 2016-01-07 6.0 0.208748 high 120.884551
7 2016-01-08 7.0 0.397707 high 86.293324
8 2016-01-09 8.0 0.377280 high 100.472668
9 2016-01-10 9.0 0.251181 medium 111.715916
10 2016-01-11 10.0 0.494740 medium 92.415336
11 2016-01-12 11.0 0.002404 low 109.513353
12 2016-01-13 12.0 0.397523 low 116.748772
13 2016-01-14 13.0 0.683249 high 88.954980
14 2016-01-15 14.0 0.572850 low 97.873740
15 2016-01-16 15.0 0.054912 low 93.183064
16 2016-01-17 16.0 0.287168 low 81.364658
17 2016-01-18 17.0 0.238257 high 110.284620
18 2016-01-19 18.0 0.361352 high 91.211863
19 2016-01-20 19.0 0.285964 low 116.367627
indexed data:
a c b
0 2016-01-01 medium nan
2 2016-01-03 low nan
5 2016-01-06 medium nan
通过上面的结果我们看到, b标签在原数据中并不存在,因此使用 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 -0.304082 0.087105 0.748594
1 0.249080 -1.190713 -1.507544
2 0.866240 -0.223880 0.373963
3 -0.482243 -0.396892 -0.804613
4 1.023823 0.475644 0.744270
5 -0.665803 1.718191 -0.464921
6 0.065006 -1.199521 -0.902912
上面示例中我们使用到了一个方法 reindex_like()。 该方法接受一个参考对象作为参数,也就是上例中的 df2。意思就是 使 df1 参照 df2 来进行重新所以,使得df1 可以和 df2 对齐。
reindex_like() 还有一个可选的参数,用来控制是否对未对齐的列/行进行填充。如果未指定,则默认使用 nan 进行填充。这种场景仅限于 行数/列数少的对象 向 行数/列数 多的对象对齐的时候。
我们用上例中的代码进行一下修改,使 df2 向 df1 对齐,并且指定参数 method=ffill (表示向前填充)。
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'])
df2_nopad = df2.reindex_like(df1)
print("nopad data:")
print(df2_nopad)
df2_pad = df2.reindex_like(df1, method="ffill")
print("pad data:")
print(df2_pad)
运行结果如下
nopad data:
col1 col2 col3
0 0.310863 -0.142038 0.045482
1 -0.956194 -0.604110 -1.477770
2 0.263676 -0.985944 -0.129015
3 1.046975 -0.390061 1.050380
4 -0.135198 2.041307 -0.782877
5 -0.560935 0.089721 -0.925693
6 0.791134 1.332370 -1.087636
7 nan nan nan
8 nan nan nan
9 nan nan nan
pad data:
col1 col2 col3
0 0.310863 -0.142038 0.045482
1 -0.956194 -0.604110 -1.477770
2 0.263676 -0.985944 -0.129015
3 1.046975 -0.390061 1.050380
4 -0.135198 2.041307 -0.782877
5 -0.560935 0.089721 -0.925693
6 0.791134 1.332370 -1.087636
7 0.791134 1.332370 -1.087636
8 0.791134 1.332370 -1.087636
9 0.791134 1.332370 -1.087636
reindex_like() 除了可以指定填充方式之外,还可以限制填充的条数 ,例如:limit=1 表示只填充一条。
同样还是使用上面的数据,我们再举一个示例。
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'])
df2_pad = df2.reindex_like(df1, method="ffill", limit=1)
print("pad data:")
print(df2_pad)
运行结果如下
pad data:
col1 col2 col3
0 -0.156857 -0.012927 1.133082
1 0.957350 -0.119164 0.956879
2 -1.575671 0.263550 -1.059915
3 0.058836 -0.484504 0.934929
4 -0.986371 0.111070 0.713525
5 -0.409603 1.196084 0.179311
6 1.236722 0.391741 0.060348
7 1.236722 0.391741 0.060348
8 nan nan nan
9 nan nan nan
我们可以看到,只使填充了一条的数据,其余的依然是使用 nan 进行填充的。
rename() 方法允许我们设定一种映射关系,对 dataframe 的行/列的标签进行重命名。仅通过描述可能不太好理解。下面我们通过示例就能很好的理解它的作用了
import pandas as pd
import numpy as np
df1 = pd.dataframe(np.random.randn(2,3),columns=['col1','col2','col3'])
print ("原始数据:")
print(df1)
print ("对行和列重命名之后的数据:")
print(df1.rename(columns={'col1' : 'c1', 'col2' : 'c2'},index = {0 : 'apple', 1 : 'banana', 2 : 'durian'}))
运行结果如下
原始数据:
col1 col2 col3
0 0.022281 -1.673832 -0.857994
1 0.543248 0.513392 0.311281
对行和列重命名之后的数据:
c1 c2 col3
apple 0.022281 -1.673832 -0.857994
banana 0.543248 0.513392 0.311281