pandas(3):索引Index/MultiIndex
- 2021 年 4 月 20 日
- 筆記
- pandas數據分析
目錄
一、索引概念
「索引」類似一本書的目錄(頁碼),通過目錄(頁碼),讓我們能快速找到想看的位置。對於一個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參數自定義列名,具體見://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表達式批量給列名加前綴