一、索引概念
“索引”類似一本書的目錄(頁碼),通過目錄(頁碼),讓我們能快速找到想看的位置。對於一個DataFrame資料框,其中:
- 行索引(Label index),是一條完整資料的索引,通過這個索引,能快速取出對應的某條資料記錄。
- 列索引(Columns Names),指向的是每一個Series。
- 行是一條完整資訊記錄,索引在業務上一般不允許重複,好的索引能方便處理資料,重複的索引匯入資料庫可能出現限制,可以設定預設配置。
- 無論是行索引還是列索引,在 Pandas 裡其實都是一個** Index 物件,都有類似的屬性和方法**。
- pandas的索引有不同的型別,目的都是為更方便處理資料。
二、建立索引
源Excel檔案index.xlsx:
①匯入資料時指定索引
- 未指定時,python會自動生成從0開始的行索引,列名預設為第1行
pandas不知道你實際業務情況,所以只能自動生成0-N的自然索引。
df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx')
df
- 自定義指定
# 指定’姓名‘或’班級‘這一列為行索引
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
# 指定’班級‘、’姓名‘這兩列為層級索引MultiIndex
df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx',index_col=[1,0])
df
也可以根據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(['班級','姓名']) # 設定班級和姓名為索引
df.set_index('姓名',drop=False) # 保留原列
df.set_index('姓名',append=True) # 保留原索引
三、常用的索引屬性
以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
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(['姓名','語文']) # 是否存在,快速檢視是否有該列名或行
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+'_') # 批量處理索引
五、索引重置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
df.reset_index() # 移除所有層級索引,並把索引還原成列
df.reset_index(drop=True) # 移除所有層級索引,捨棄原索引
df.reset_index(['姓名']) # 只把姓名這一層索引還原層列
六、修改索引值(修改列名)
# 一對一對應修改
df.rename(columns={'數學': 'maths'})
# 也可以通過一些函式進行批量修改
df.rename(lambda x:'t_' + x, axis=1) # 通過lambda表示式批量給列名加字首