pandas(3):索引Index/MultiIndex

發表於2021-04-20

一、索引概念

  “索引”類似一本書的目錄(頁碼),通過目錄(頁碼),讓我們能快速找到想看的位置。對於一個DataFrame資料框,其中:

  • 行索引(Label index),是一條完整資料的索引,通過這個索引,能快速取出對應的某條資料記錄。
  • 列索引(Columns Names),指向的是每一個Series。
  • 行是一條完整資訊記錄,索引在業務上一般不允許重複,好的索引能方便處理資料,重複的索引匯入資料庫可能出現限制,可以設定預設配置。
  • 無論是行索引還是列索引,在 Pandas 裡其實都是一個** Index 物件,都有類似的屬性方法**。
  • pandas的索引有不同的型別,目的都是為更方便處理資料。

二、建立索引

  源Excel檔案index.xlsx:
image

①匯入資料時指定索引

  • 未指定時,python會自動生成從0開始的行索引,列名預設為第1行
     pandas不知道你實際業務情況,所以只能自動生成0-N的自然索引。
df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx')
df

image

  • 自定義指定
# 指定’姓名‘或’班級‘這一列為行索引
df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx',index_col='姓名')
# df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx',index_col='班級')
df

image

# 指定’班級‘、’姓名‘這兩列為層級索引MultiIndex
df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx',index_col=[1,0])
df

image
 也可以根據header引數指定哪行作為列名,或根據names引數自定義列名,具體見:https://www.cnblogs.com/xiaoshun-mjj/p/14538695.html

②匯入資料後指定索引df.set_index()

DataFrame.set_index(keys, drop=True, append=False, 
                    inplace=False, verify_integrity=False)

引數說明:

  • keys:列標籤或列標籤/列表/series,需要設定為索引的列;
  • drop:是否保留設定索引的原列。預設為True,不保留;
  • append:是否保留原索引。預設為False,不保留;
  • inplace:輸入布林值,表示當前操作是否對原資料生效,預設為False。
  • verify_integrity:檢查新索引的副本。否則,請將檢查推遲到必要時進行。將其設定為false將提高該方法的效能,預設為false。
# 匯入資料時,未指定索引
df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx')
df.set_index('姓名') # 設定姓名為索引
df.set_index(['班級','姓名']) # 設定班級和姓名為索引

image

df.set_index('姓名',drop=False)  # 保留原列
df.set_index('姓名',append=True) # 保留原索引

image

三、常用的索引屬性

以df.index為例,也適用於 df.columns, 因為兩者都是 index 物件

df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx') # 匯入資料時,未指定索引
df.set_index('姓名',drop=False,inplace=True)  # 保留原列,對原資料生效
# 檢視索引資訊(值和型別,還有可能有名稱)
df.columns
df.index

image

df.index.name # 行索引名稱
df.index.dtype # 索引資料型別
df.index.shape # 形狀
df.index.size # 元素數量,行記錄條數
# df.columns.size
df.index.values # 索引的值,array 陣列
# df.index.value_counts() # 去重統計
# df.index.values.tolist() # array 陣列轉換成列表list
df.index.is_unique # 判斷是否有重複,業務上原則一般不會重複,有重複返回False

四、常用索引方法

一樣適用於 df.columns。

df.columns.isin(['姓名','語文']) # 是否存在,快速檢視是否有該列名或行

image

df.index.nunique() # 不重複值的數量
df.index.sort_values(ascending=False) # 排序,倒序
df.index.to_frame(index=False) # 轉成 DataFrame
df.index.unique() # 去重
df.index.value_counts() # 去重分組統計
df.index.where(df.index=='林*') # 篩選,檢視是否由該行記錄
df.index.max() # 最大值
df.index.map(lambda x:x+'_') # 批量處理索引

image

五、索引重置reset_index()

列可以變成索引,索引也能回覆成列。

DataFrame.reset_index(level=None, drop=False, 
                    inplace=False, col_level=0, col_fill='')

引數說明:

  • level:數值型別可以為:int、str、tuple或list,預設無,僅從索引中刪除給定級別。預設情況下移除所有級別。控制了具體要還原的那個等級的索引 。
  • drop:當指定drop=False時,則索引列會被還原為普通列;否則,經設定後的新索引值被會丟棄。預設為False。
  • inplace:輸入布林值,表示當前操作是否對原資料生效,預設為False。
  • col_level:數值型別為int或str,預設值為0,如果列有多個級別,則確定將標籤插入到哪個級別。預設情況下,它將插入到第一級。
  • col_fill:物件,預設‘’,如果列有多個級別,則確定其他級別的命名方式。如果沒有,則重複索引名。
df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx') # 匯入資料時,未指定索引
df = df.set_index(['姓名','班級']) # 設定MultiIndex
df

image

df.reset_index() # 移除所有層級索引,並把索引還原成列
df.reset_index(drop=True) # 移除所有層級索引,捨棄原索引
df.reset_index(['姓名']) # 只把姓名這一層索引還原層列

image

六、修改索引值(修改列名)

# 一對一對應修改
df.rename(columns={'數學': 'maths'})
# 也可以通過一些函式進行批量修改
df.rename(lambda x:'t_' + x, axis=1) # 通過lambda表示式批量給列名加字首

相關文章