上篇文章介紹了Pandas的基礎操做,包括文件讀寫、Series和DataFrame數據結構、一些經常使用基本函數、數據排序等。
今天咱們來學習一下Pandas的索引。
(超詳細!一文搞定!)python
這三類最經常使用的索引方法,其中iloc表示位置索引,loc表示標籤索引,[]也具備很大的便利性,各有特色。
總結來講就是:數據結構
1.1 loc方法app
- 本質上來講,loc中能傳入的只有布爾列表和索引子集構成的列表。
- loc方法包含切片右端點。
# 單行索引 dataframe.loc[index] # 多行索引 dataframe.loc[index1, index2] dataframe.loc[index: ] dataframe.loc[開始:結束:步長] # 多列索引 dataframe[:, '列索引名'] # 函數式索引(傳入的參數是dataframe) dataframe.loc[lambda x:x['Gender']=='M'] def f(x): return [1101,1103] df.loc[f]
1.2 iloc方法dom
- iloc中接收的參數只能爲整數或整數列表,不能使用布爾索引
- iloc方法不包含切片右端點。
# 單行索引 df.iloc[3] #多行索引 df.iloc[3:5] # 單列索引 df.iloc[:,3] # 多列索引 df.iloc[:,7::-2] # 函數式索引 df.iloc[lambda x:[3]]
1.3 []操做符函數
- 在Series中的浮點[]並非進行位置比較,而是值比較,所以不要在行索引爲浮點時使用[]操做符。
- []操做符經常使用於列選擇或布爾選擇,儘可能避免行的選擇
(1) Series的[]操做符學習
s = pd.Series(df['Math'],index=df.index) # 單元素索引 s[1101] # 多行索引 s[0:4] # 函數式索引 s[lambda x: x.index[16::-6]] # 布爾索引 s[s>80]
(2) DataFrame的[]操做符3d
# 單行索引 df[1:2] row = df.index.get_loc(1102) # get_loc()返回索引值(所在的行號) df[row:row+1] # 多行操做 df[3:5] # 切片 # 單列索引 df['School'] # 多列索引 df[['School','Math']] # 函數式索引 df[lambda x:['Math','Physics']]
2.1 布爾符號:'&', '|', '~',分別表明 和and,或or,非notrest
df[(df['Gender']=='F')&(df['Address']=='street_2')]
df[(df['Math']>85)|(df['Address']=='street_7')].head()
df[~((df['Math']>75)|(df['Address']=='street_1'))]
2.2 isin方法code
df[df['Address'].isin(['street_1','street_4'])&df['Physics'].isin(['A','A+'])] # 字典方式 df[df[['Address','Physics']].isin({'Address':['street_1','street_4'],'Physics':['A','A+']}).all(1)] #all與&的思路是相似的,其中的1表明按照跨列方向判斷是否全爲True
at和iat方法,適用於只取一個元素的狀況。
一樣,at只能傳佈爾列表或索引列表,iat只能傳整數列表對象
df.at[1101,'School'] df.iat[0,0]
(1) interval_range方法:
#closed參數可選'left''right''both''neither',默認左開右閉 pd.interval_range(start=0,end=5) # periods參數控制區間個數,freq控制步長 pd.interval_range(start=0,periods=8,freq=5)
下面用一個具體的例子——統計數學成績的區間狀況,來講明區間索引。
math_interval = pd.cut(df['Math'],bins=[0,40,60,80,100]) df_i = df.join(math_interval,rsuffix='_interval')[['Math','Math_interval']].reset_index().set_index('Math_interval') df_i.head()
df_i.loc[90] # 會選中該值的區間
若是想要選取某個區間,先要把分類變量轉爲區間變量,再使用overlap方法:
df_i[df_i.index.astype('interval').overlaps(pd.Interval(70, 85))].head()
多層索引的建立主要有三類方法:
1.1 from_tuple或from_arrays
# 直接建立 tuples = [('A','a'),('A','b'),('B','a'),('B','b')] mul_index = pd.MultiIndex.from_tuples(tuples, names=('Upper', 'Lower')) pd.DataFrame({'Score':['perfect','good','fair','bad']},index=mul_index) # 利用zip L1 = list('AABB') L2 = list('abab') tuples = list(zip(L1,L2)) mul_index = pd.MultiIndex.from_tuples(tuples, names=('Upper', 'Lower')) pd.DataFrame({'Score':['perfect','good','fair','bad']},index=mul_index) # 經過array arrays = [['A','a'],['A','b'],['B','a'],['B','b']] mul_index = pd.MultiIndex.from_tuples(arrays, names=('Upper', 'Lower')) pd.DataFrame({'Score':['perfect','good','fair','bad']},index=mul_index)
經過打印mul_index
能夠看出,上述三種方式都是經過內部自動轉換成元組來建立的。
1.2 from_product
L1
和L2
兩兩相乘
L1 = ['A','B'] L2 = ['a','b'] pd.MultiIndex.from_product([L1,L2],names=('Upper', 'Lower'))
1.3 指定dataframe的列(set_index方法)
df_using_mul = df.set_index(['Class','Address']) df_using_mul.head()
這裏舉例都是用上一小節的df_using_mul作演示。
(1)通常切片
# 當索引不排序時,不能使用多層切片 df_using_mul.sort_index().loc['C_2','street_5'] df_using_mul.sort_index().loc[('C_2','street_6'):('C_3','street_4')] df_using_mul.sort_index().loc[('C_2','street_7'):'C_3'].head()
(2)第一類特殊狀況:由元組構成列表
df_using_mul.sort_index().loc[[('C_2','street_7'),('C_3','street_2')]] # 表示選出某幾個元素,精確到最內層索引
第二類特殊狀況:由列表構成元組
df_using_mul.sort_index().loc[(['C_2','C_3'],['street_4','street_7']),:] # 選出第一層在‘C_2’和'C_3'中且第二層在'street_4'和'street_7'中的行
L1,L2 = ['A','B','C'],['a','b','c'] mul_index1 = pd.MultiIndex.from_product([L1,L2],names=('Upper', 'Lower')) L3,L4 = ['D','E','F'],['d','e','f'] mul_index2 = pd.MultiIndex.from_product([L3,L4],names=('Big', 'Small')) df_s = pd.DataFrame(np.random.rand(9,9),index=mul_index1,columns=mul_index2) idx=pd.IndexSlice
索引Slice的使用很是靈活,能夠很方便地對索引進行操做。
結果以下:索引取了B
後面的、D d>0.3
的、縱向求和>4的部分。
df_s.loc[idx['B':,df_s['D']['d']>0.3],idx[df_s.sum()>4]]
主要有兩個方法:
# swaplevel方法 df_using_mul.swaplevel(i=1,j=0,axis=0).sort_index() # recorder_levels方法 df_muls = df.set_index(['School','Class','Address']) df_muls.reorder_levels([1,2,0],axis=0).sort_index() #若是索引有name,能夠直接使用name df_muls.reorder_levels(['Class','Address','School'],axis=0).sort_index()
這部分所講的是索引設定的一些操做。
(1)index_col參數
在使用read_csv函數時,經過index_col能夠設定索引。
(2)reindex和reindex_like
#bfill表示用所在索引的後一個有效行填充,ffill爲前一個有效行,nearest是指最近的 df.reindex(index=[1101,1203,1206,2402], columns=['Height','Gender','Average'], method='bfill')
df_temp = pd.DataFrame({'Weight':range(5), 'Height':range(5), 'ID':[1101,1104,1103,1106,1102]}).set_index('ID').sort_index() df_temp.reindex_like(df[0:5][['Weight','Height']],method='bfill') #能夠自行檢驗這裏的1105的值是不是由bfill規則填充
(3)set_index和reset_index
append=True
能夠維持當前索引不變(4)rename_axis和rename
df_temp.rename_axis(index={'Lower':'LowerLower'},columns={'Big':'BigBig'}) df_temp.rename(index={'A':'T'},columns={'e':'changed_e'})
(後面內容後續補充)
如什麼問題,歡迎留言交流,以爲有用的小夥伴順手點個贊吧。
你的確定是個人最大動力!