46 pandas reindex-重新索引(tcy)

tcy23456發表於2019-01-09

reindex-重新索引2019/1/9

作用是建立一個適應新索引的新物件

1.函式

df.reindex(labels = None,index = None,columns = None,axis = None,method = None,
           copy = True,level = None,fill_value = nan,limit = None,tolerance = None )#返回新索引
  # 除非新索引等效於當前索引並且copy = False,否則將生成新物件
    
  # 重新索引會更改行標籤和列標籤。資料匹配標籤。新標籤位置插入缺失值(NA) fill or pad向前填充;bfill 向後填充

引數 

labels = None類似陣列,新標籤/索引
index,columnsarray-like(應該使用關鍵字指定)新標籤/索引。優選索引物件以避免重複資料
axisint或str,軸('index','columns')或數字(0,1)
method =None{None,'pad/bfill','pad'/'ffill','nearest'},填充空值方法。僅適用單調遞增/遞減
      pad / ffill  用前面的值填充 預設不填補空白
      backfill / bfill  用後面的值填充
copy=True即使傳遞的索引相同,也返回一個新物件
levelint或name跨級別廣播,匹配傳遞的MultiIndex級別的索引值
fill_value標量,預設np.NaN用於缺失值的值。可是任何值
limitint,向前或向後填充的最大連續元素數
tolerance  不精確匹配的原始和新標籤之間的最大距離。

呼叫約定

(index=index_labels,  columns=column_labels,  ...)

(labels,  axis={'index', 'columns'}, ...)

建議您使用關鍵字引數來闡明您的意圖

例項1:序列

s=pd.Series([11,12,13],index=list('abc'))
s.reindex(list('bcd'))

b 12.0
c 13.0
d NaN
dtype: float64

例項2:DataFrame

例項1:重新索引行列

例項1.1:重新索引行

index = ['a1', 'a2', 'a3', 'a4', 'a5']
df = pd.DataFrame({ 'A1': [10,11,12,13,14], 'A2': [21, 22, 23, 24, 25]},index=index)

new_index= ['a7', 'a6', 'a4', 'a3','a2']
result1=df.reindex(new_index)

例項1.2:重新索引列
result2=df.reindex(columns=['A1', 'A3'])
result2=df.reindex(['A1', 'A3'], axis="columns")#使用“軸式”關鍵字引數

例項1.3:重新索引行列 (插值只能按行)
result3=df.reindex(index=['a1','a2','b1'],columns=['A1', 'A3'],fill_value=99)
df.loc[['a1','b1'],['A1','C1']]#報警未定義的標籤

# df     result1      result2   result3
   A1 A2     A1 A2       A1 A3     A1 A3
a1 10 21 a7 NaN NaN   a1 10 NaN a1 10 99
a2 11 22 a6 NaN NaN   a2 11 NaN a2 11 99
a3 12 23 a4 13.0 24.0 a3 12 NaN b1 99 99
a4 13 24 a3 12.0 23.0 a4 13 NaN
a5 14 25 a2 11.0 22.0 a5 14 NaN

例項2:fill_value填充缺失值 

df.reindex(['a7', 'a6', 'a4', 'a3','a2'], fill_value=99)
df.reindex(['a7', 'a6', 'a4', 'a3','a2'], fill_value='NG')

   A1 A2    A1 A2
a7 99 99 a7 NG NG
a6 99 99 a6 NG NG
a4 13 24 a4 13 24
a3 12 23 a3 12 23
a2 11 22 a2 11 22

例項3:method-建立單調遞增索引

date_index = pd.date_range('1/1/2019', periods=4, freq='D')
df2 = pd.DataFrame({"prices": [100, 101, np.nan, 103]},index=date_index)

date_index2 = pd.date_range('12/31/2018', periods=6, freq='D')
df2.reindex(date_index2)
df2.reindex(date_index2, method='bfill')#原始資料值Nan不填充;索引必單調遞增或遞減
df2.reindex(date_index2, method='pad')#原始資料值Nan不填充;索引必單調遞增或遞減

# df             result1          result2          result3
          prices         prices             prices            prices
2019-01-01 100.0 2018-12-31 NaN   2018-12-31 100.0 2018-12-31 NaN
2019-01-02 101.0 2019-01-01 100.0 2019-01-01 100.0 2019-01-01 100.0 
2019-01-03 NaN   2019-01-02 101.0 2019-01-02 101.0 2019-01-02 101.0 
2019-01-04 103.0 2019-01-03 NaN   2019-01-03 NaN   2019-01-03 NaN
2019-01-04 103.0 2019-01-04 103.0 2019-01-04 103.0
2019-01-05 NaN   2019-01-05 NaN 2019-01-05 103.0

例項4:reindex的坑

df = pd.DataFrame(np.arange(12).reshape(6, 2), columns=['A', 'B'],index=list('abcdef'))

df.reindex(['b', 'c', 'e']) #應該這樣用 等價df.iloc[[1, 2, 4]]
df.reindex([1, 2, 4])       #出現異常值

  A B     A B
b 2 3 1 NaN NaN
c 4 5 2 NaN NaN
e 8 9 4 NaN NaN

 

 

 

相關文章