導語
pandas不是像list和numpy一樣傳統的索引,它需要df.函數()來連接
傳統的方式適用於單獨選取dataframe行或者列。
導入數據:
1 #導入pandas和numpy庫 2 import pandas as pd 3 import numpy as np 4 from pandas import Series,DataFrame 5 test=pd.read_excel("/Users/yaozhilin/Downloads/exercise.xlsx",sep="t") 6 test.head(5)#顯示前五行
單獨選取行或者列
1 test[:2]#選取行
1 test["工單號"].head(3)
0 A12-086 1 A12-087 2 A12-088 Name: 工單號, dtype: object
•loc
基於標簽索引
1、行與列的list或者切片選取(.loc[:,[]]或.loc[[],:]等)
2、行的布爾值篩選與列的list或者切片選取進行條件篩選
注:因為基於標簽索引,所以索引結果為前閉后閉
~行和列的切片或者[]組合選取
1 test.loc[:4,["工單號","所屬區域","數量"]]#行-切片,列-list
1 test.loc[[1,2,3],["工單號","所屬區域","數量"]]#行-list,列-list
~行的布爾值篩選與列的list或者切片選取進行條件篩選
1 test.loc[test["數量"]>=800,["工單號","所屬區域","數量"]]#行-布爾值,列-list
•iloc
iloc:基於位置索引 是傳統的前閉后開
正常索引與loc一樣行和列可以隨意切片或者是[]的形式
1 test.iloc[0:3,0:3]
布爾值索引篩選過濾:
因為loc是直接將標簽和篩選值連在一起可以直接篩選,而iloc是基於位置的篩選不能直接識別篩選值
1 test["數量"].values#變為數組獲取值的位置
1 test.iloc[test["數量"].values>=800,0:3]
多重索引
構建多重索引:
~set_index、reset_index原表數據構建
test.set_index( keys,drop=True,append=False, inplace=False,verify_integrity=False)
drop表示設置為新索引的列是否保存在原數據
append表示舊的索引是否保存
1 test.set_index(["所屬區域","產品類別"],drop=True,append=True,inplace=True) 2 test
還原
1 test.reset_index(level=[1,2],inplace=True)2 test
~zip創建
pd.MultiIndex.from_tuples、zip的用法:將兩集合拆包組成新的配對集合
1 X=[1,2,3,4] 2 Y=['a','b','c','d'] 3 XY=list(zip(X,Y)) 4 print(XY)
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
1 z1,z2=zip(*XY)
1 z1
(1, 2, 3, 4)
1 indexs=pd.MultiIndex.from_tuples(XY,names=["first","scend"])
1 df=pd.DataFrame(np.random.randn(4),columns=['A'],index=indexs) 2df
loc常規按順序索引
1 test.set_index(["所屬區域","產品類別"],drop=True,inplace=True) 2 test.loc[("蘇州","睡袋"),"數量"]#indexs用(),且不能不寫第一索引
所屬區域 產品類別 蘇州 睡袋 120.0 睡袋 160.0 睡袋 100.0 睡袋 360.0 睡袋 240.0 睡袋 120.0
.....
注:test.loc[(,"睡袋")]
但是直接跳過第一索引會報錯
可使用slice切片組合使用,但slice使用過程中所有索引與列均要顯示指出
1 test.loc[(slice(None),"睡袋"),:]#冒號不能省略