1. 程式人生 > >利用python做資料分析(六)-reindex

利用python做資料分析(六)-reindex

DataFrame.reindex(index=None, columns=None, **kwargs)
reindex 函式的引數

引數 說明
method 插值填充方法
fill_value 引入的缺失資料值
limit 填充間隙
copy 如果新索引與就的相等則底層資料不會拷貝。預設為True(即始終拷貝)
level 在多層索引上匹配簡單索引

pandas的reindex物件,是資料符合新的索引來構造一個新的物件

import pandas as pd
obj = pd.Series([4.5
, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c']) obj d 4.5 b 7.2 a -5.3 c 3.6 dtype: float64

Series的reindex使它符合新的索引,如果索引的值不存在就填入缺失值

obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])
obj2

a   -5.3
b    7.2
c    3.6
d    4.5
e    NaN
dtype: float64
obj.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0
) a -5.3 b 7.2 c 3.6 d 4.5 e 0.0 dtype: float64

method選項來控制填充值或內插值:
method : {None, ‘backfill’/’bfill’, ‘pad’/’ffill’, ‘nearest’}, optional。
ffill/pad 向前或進位填充,bfill/backfill 向後或進位填充

obj3 = pd.Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])
obj3.reindex(range(6), method='ffill')

0      blue
1 blue 2 purple 3 purple 4 yellow 5 yellow dtype:
object

向後填充

obj3.reindex(range(6), method='bfill')
0      blue
1    purple
2    purple
3    yellow
4    yellow
5       NaN
dtype: object

對於DataFrame, reindex 可以改變(行)索引,列或兩者。當只傳入一個序列時,結果中的行被重新索引:

frame = pd.DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'],columns=['Ohio', 'Texas', 'California'])
frame

    Ohio Texas  California
a   0   1   2
c   3   4   5
d   6   7   8
frame2 = frame.reindex(['a', 'b', 'c', 'd'])
frame2
    Ohio    Texas   California
a   0.0 1.0 2.0
b   NaN NaN NaN
c   3.0 4.0 5.0
d   6.0 7.0 8.0

使用column可以將列進行重新索引

states = ['Texas', 'Utah', 'California']
frame.reindex(columns=states)

   Texas    Utah    California
a   1   NaN 2
c   4   NaN 5
d   7   NaN 8

此時的frame依然是原樣

frame
    Ohio    Texas   California
a   0   1   2
c   3   4   5
d   6   7   8

也可以同時讀列和index進行reindex,可是插值只在行側

frame.reindex(index=['a', 'b', 'c', 'd'], method='ffill',columns=states)

    Texas   Utah    California
a   1   NaN 2
b   1   NaN 2
c   4   NaN 5
d   7   NaN 8

level

關於level可能大家不太理解。level主要在多層索引上用到。舉例:
繼續之前的話題,我想看到新生兒名字中最後一位字母的變化.

get_last_letter=lambda x:x[-1]
last_letters=names.name.map(get_last_letter)
last_letters.name='last_letter'

table=pd.pivot_table(names,index=[last_letters],values='births',columns=['sex','year'],aggfunc=sum)
table

這裡寫圖片描述

比如我想看其中三年的資料,改怎麼辦。

按照之前的做法,需要table[‘column name’],但是你會發現table[‘F’]或者table[‘M’]還行,但是還有一層column可怎麼辦。
正確做法如下:

subtable=table.reindex(columns=[1910,1960,2010],level='year')
subtable

這裡寫圖片描述

請細細體會。

subtable.index

Index(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
       'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'],
      dtype='object', name='last_letter')
In [7]:
subtable.columns

MultiIndex(levels=[['F', 'M'], [1910, 1960, 2010]],
           labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]],
           names=['sex', 'year'])

下一章講MultiIndex