7-Pandas reindex重置索引

Pandas reindex重置索引

重置索引(reindex)可以更改原 DataFrame 的行标签或列标签,并使更改后的行、列标签与 DataFrame 中的数据逐一匹配。通过重置索引操作,您可以完成对现有数据的重新排序。如果重置的索引标签在原 DataFrame 中不存在,那么该标签对应的元素值将全部填充为 NaN。

重置行列标签

看一组简单示例:

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()
})
#重置行、列索引标签
df_reindexed = df.reindex(index=[0,2,5], columns=['A', 'C', 'B'])
print(df_reindexed)

输出结果:

           A       C   B
0 2016-01-01  Medium NaN
2 2016-01-03  Medium NaN
5 2016-01-06    High NaN

现有 a、b 两个 DataFrame 对象,如果想让 a 的行索引与 b 相同,您可以使用 reindex_like() 方法。示例如下:

import pandas as pd
import numpy as np
a = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])
b = pd.DataFrame(np.random.randn(7,3),columns=['col1','col2','col3'])
a= a.reindex_like(b)
print(a)

输出结果:

       col1      col2      col3
0  0.343660  0.056285 -0.477379
1  0.101957  0.718878  2.348352
2 -0.097211 -0.457982 -1.262696
3  0.310783 -0.146773 -0.196195
4  0.873772 -0.002106  2.183461
5  0.282574  0.564408 -0.211530
6 -0.871764 -1.361689  0.546752

上述示例,a 会按照 b 的形式重建行索引。需要特别注意的是,a 与 b 的列索引标签必须相同。

填充元素值

reindex_like() 提供了一个可选的参数method,使用它来填充相应的元素值,参数值介绍如下:

  • 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'])
#使df2和df1行标签相同
print(df2.reindex_like(df1))
#向前填充
print(df2.reindex_like(df1,method='ffill'))

输出结果:

       col1      col2      col3
0 -0.440492  1.168435 -0.061357
1 -0.410103  0.873703 -1.020315
2       NaN       NaN       NaN
3       NaN       NaN       NaN
4       NaN       NaN       NaN
5       NaN       NaN       NaN
       col1      col2      col3
0 -0.440492  1.168435 -0.061357
1 -0.410103  0.873703 -1.020315
2 -0.410103  0.873703 -1.020315
3 -0.410103  0.873703 -1.020315
4 -0.410103  0.873703 -1.020315
5 -0.410103  0.873703 -1.020315

限制填充行数

reindex_like() 还提供了一个额外参数 limit,该参数用来控制填充的最大行数。示例如下:

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'])
print (df2.reindex_like(df1))
#最多填充2行
print (df2.reindex_like(df1,method='ffill',limit=2))

输出结果:

       col1     col2      col3
0  1.167037  0.44139  0.502009
1  0.433242 -0.15878  1.109794
2       NaN      NaN       NaN
3       NaN      NaN       NaN
4       NaN      NaN       NaN
5       NaN      NaN       NaN
       col1     col2      col3
0  1.167037  0.44139  0.502009
1  0.433242 -0.15878  1.109794
2  0.433242 -0.15878  1.109794
3  0.433242 -0.15878  1.109794
4       NaN      NaN       NaN
5       NaN      NaN       NaN

由上述示例可以看出,填充了 2、3 行 缺失值,也就是只填充了 2 行数据。

重命名标签

rename() 方法允许您使用某些映射(dict或Series)或任意函数来对行、列标签重新命名,示例如下:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
print (df1)
#对行和列重新命名
print (df1.rename(columns={'col1' : 'c1', 'col2' : 'c2'},index = {0 : 'apple', 1 : 'banana', 2 : 'durian'}))

输出结果:

       col1      col2      col3
0 -0.284484  0.031197  1.455534
1  2.188401  1.155837 -1.079025
2 -0.866940  1.579963 -0.232450
3  0.151354  1.133572  1.226395
4 -0.498945 -1.168910 -0.910283
5  0.987789  0.393054 -0.625249
              c1        c2      col3
apple  -0.284484  0.031197  1.455534
banana  2.188401  1.155837 -1.079025
durian -0.866940  1.579963 -0.232450
3       0.151354  1.133572  1.226395
4      -0.498945 -1.168910 -0.910283
5       0.987789  0.393054 -0.625249

rename() 方法提供了一个 inplace 参数,默认值为 False,表示拷贝一份原数据,并在复制后的数据上做重命名操作。若 inplace=True 则表示在原数据的基础上重命名。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值