Python Pandas reindex 重新索引

重新索引会更改 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()

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

查看笔记

扫码一下
查看教程更方便