>>> from env_helper import info; info()
页面更新时间: 2024-04-07 23:40:25
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

6.8. Pandas重建索引

重新索引会更改DataFrame的行标签和列标签。重新索引意味着符合数据以匹配特定轴上的一组给定的标签。

可以通过索引来实现多个操作 -

  • 重新排序现有数据以匹配一组新的标签。

  • 在没有标签数据的标签位置插入缺失值( NA )标记。

6.8.1. 示例

>>> 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'])
>>>
>>> df_reindexed
A C B
0 2016-01-01 High NaN
2 2016-01-03 High NaN
5 2016-01-06 High NaN

重建索引与其他对象对齐

有时可能希望采取一个对象和重新索引,其轴被标记为与另一个对象相同。 考虑下面的例子来理解这一点。

6.8.2. 示例

>>> 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)
>>> df1
col1 col2 col3
0 0.192948 -0.085034 -1.070548
1 0.147941 -1.962073 -0.269670
2 0.321556 -1.044896 -0.951445
3 -0.302581 -0.938571 -0.326822
4 -2.047716 -1.028022 -0.771213
5 1.440751 -2.469872 0.689185
6 -0.614466 0.209999 0.873476

注意 - 在这里, df1 数据帧(DataFrame)被更改并重新编号,如 df2 。 列名称应该匹配,否则将为整个列标签添加 NAN

填充时重新加注

reindex() 采用可选参数方法,它是一个填充方法,其值如下:

  • pad/ffill - 向前填充值

  • bfill/backfill - 向后填充值

  • nearest - 从最近的索引值填充

6.8.3. 示例

>>> 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:")
>>> df2.reindex_like(df1,method='ffill')
       col1      col2      col3
0  0.876197 -0.565521 -0.059547
1  0.197728  0.250809 -0.522719
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 0.876197 -0.565521 -0.059547
1 0.197728 0.250809 -0.522719
2 0.197728 0.250809 -0.522719
3 0.197728 0.250809 -0.522719
4 0.197728 0.250809 -0.522719
5 0.197728 0.250809 -0.522719

注 - 最后四行被填充了。

重建索引时的填充限制

限制参数在重建索引时提供对填充的额外控制。限制指定连续匹配的最大计数。考虑下面的例子来理解这个概念 -

6.8.4. 示例

>>> 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:")
>>> df2.reindex_like(df1,method='ffill',limit=1)
       col1      col2      col3
0  0.362162  1.017381 -1.553586
1  1.021244  0.006718  1.642164
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.362162 1.017381 -1.553586
1 1.021244 0.006718 1.642164
2 1.021244 0.006718 1.642164
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN

注意 - 只有第7行由前6行填充。 然后,其它行按原样保留。

重命名

rename() 方法允许基于一些映射(字典或者系列)或任意函数来重新标记一个轴。

看看下面的例子来理解这一概念。

6.8.5. 示例

>>> 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.649723  1.200927 -1.611861
1  1.049107  0.973577 -0.015350
2 -1.409827  0.756406  0.739770
3 -0.259753 -1.274613 -0.822406
4  0.863751  0.475824 -0.453927
5  0.570633 -0.317745  1.543424
After renaming the rows and columns:
              c1        c2      col3
apple  -0.649723  1.200927 -1.611861
banana  1.049107  0.973577 -0.015350
durian -1.409827  0.756406  0.739770
3      -0.259753 -1.274613 -0.822406
4       0.863751  0.475824 -0.453927
5       0.570633 -0.317745  1.543424

rename() 方法提供了一个 inplace 命名参数,默认为 False 并复制底层数据。 指定参数 inplace = True 则表示将数据重命名。