>>> 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
则表示将数据重命名。