pandas之reindex重置索引


重置索引(reindex)可以更改原 DataFrame 的行標簽或列標簽,並使更改后的行、列標簽與 DataFrame 中的數據逐一匹配。通過重置索引操作,您可以完成對現有數據的重新排序。如果重置的索引標簽在原 DataFrame 中不存在,那么該標簽對應的元素值將全部填充為 NaN。

重置行列標簽

看一組簡單示例:

  1. import pandas as pd
  2. import numpy as np
  3. N=20
  4. df = pd.DataFrame({
  5. 'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
  6. 'x': np.linspace(0,stop=N-1,num=N),
  7. 'y': np.random.rand(N),
  8. 'C': np.random.choice(['Low','Medium','High'],N).tolist(),
  9. 'D': np.random.normal(100, 10, size=(N)).tolist()
  10. })
  11. #重置行、列索引標簽
  12. df_reindexed = df.reindex(index=[0,2,5], columns=['A', 'C', 'B'])
  13. print(df_reindexed)

輸出結果:

           A       C   B
0 2020-12-07  Medium NaN
2 2020-12-09     Low NaN
5 2020-12-12    High NaN

現有 a、b 兩個 DataFrame 對象,如果想讓 a  的行索引與 b 相同,您可以使用 reindex_like() 方法。示例如下:

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

輸出結果:

       col1      col2      col3
0  1.776556 -0.821724 -1.220195
1 -1.401443  0.317407 -0.663848
2  0.300353 -1.010991  0.939143
3  0.444041 -1.875384  0.846112
4  0.967159  0.369450 -0.414128
5  0.320863 -1.223477 -0.337110
6 -0.933665  0.909382  1.129481

上述示例,a 會按照 b 的形式重建行索引。需要特別注意的是,a 與 b 的列索引標簽必須相同。

填充元素值

reindex_like() 提供了一個可選的參數method,使用它來填充相應的元素值,參數值介紹如下:

  • pad/ffill:向前填充值;
  • bfill/backfill:向后填充值;
  • nearest:從距離最近的索引值開始填充。


示例如下:

  1. import pandas as pd
  2. import numpy as np
  3. df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
  4. df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
  5. #使df2和df1行標簽相同
  6. print(df2.reindex_like(df1))
  7. #向前填充
  8. print(df2.reindex_like(df1,method='ffill'))

輸出結果:

#填充前
       col1      col2      col3
0  0.129055  0.835440  0.383065
1 -0.357231  0.379293  1.211549
2       NaN       NaN       NaN
3       NaN       NaN       NaN
4       NaN       NaN       NaN
5       NaN       NaN       NaN
#填充后
       col1      col2      col3
0  0.129055  0.835440  0.383065
1 -0.357231  0.379293  1.211549
2 -0.357231  0.379293  1.211549
3 -0.357231  0.379293  1.211549
4 -0.357231  0.379293  1.211549
5 -0.357231  0.379293  1.211549

限制填充行數

reindex_like() 還提供了一個額外參數 limit,該參數用來控制填充的最大行數。示例如下:

  1. import pandas as pd
  2. import numpy as np
  3. df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
  4. df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
  5. print (df2.reindex_like(df1))
  6. #最多填充2行
  7. print (df2.reindex_like(df1,method='ffill',limit=2))

輸出結果:

       col1      col2      col3
0 -1.829469  0.310332 -2.008861
1 -1.038512  0.749333 -0.094335
2       NaN       NaN       NaN
3       NaN       NaN       NaN
4       NaN       NaN       NaN
5       NaN       NaN       NaN

       col1      col2      col3
0 -1.829469  0.310332 -2.008861
1 -1.038512  0.749333 -0.094335
2 -1.038512  0.749333 -0.094335
3 -1.038512  0.749333 -0.094335
4       NaN       NaN       NaN
5       NaN       NaN       NaN

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

重命名標簽

rename() 方法允許您使用某些映射(dict或Series)或任意函數來對行、列標簽重新命名,示例如下:

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

輸出結果:

       col1      col2      col3
0 -1.762133 -0.636819 -0.309572
1 -0.093965 -0.924387 -2.031457
2 -1.231485 -0.738667  1.415724
3 -0.826322  0.206574 -0.731701
4  1.863816 -0.175705  0.491907
5  0.677361  0.870041 -0.636518

              c1        c2      col3
apple  -1.762133 -0.636819 -0.309572
banana -0.093965 -0.924387 -2.031457
durian -1.231485 -0.738667  1.415724
3      -0.826322  0.206574 -0.731701
4       1.863816 -0.175705  0.491907
5       0.677361  0.870041 -0.636518

rename() 方法提供了一個 inplace 參數,默認值為 False,表示拷貝一份原數據,並在復制后的數據上做重命名操作。若 inplace=True 則表示在原數據的基礎上重命名。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM