Pandas的數值訪問(.loc, .iloc, .ix訪問數據的區別)+query+set_index和reset_index

今天整理的三個pandas的小知識點,是從工業化生產預測這個比賽中用到的三個,所以集體來整理一下:

1. pandas數值訪問(.loc, .iloc,.ix)

首先,建立一個pd.DataFrame做演示:

import pandas as pd
data = pd.DataFrame({'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]},index=["a","b","c"])
data

## 結果:

    A	B	C
a	1	4	7
b	2	5	8
c	3	6	9
  1. .loc[]函數:
    通過行索引 “Index” 中的具體值來取行數據。括號裏面是先行後列,以逗號分割,行和列分別是行標籤和列標籤。比如我要得到數字5:

    data.loc["b","B"]
    

    因爲行標籤爲b,列標籤爲B,同理,那麼4就是data[“a”,”B”]
    上面只是選擇某一個值,那麼如果我要選擇一個區域呢,比如我要選擇5,8,6,9,那麼可以這樣做:

    data.loc['b':'c','B':'C']
    

    因爲選擇的區域,左上角的值是5,右下角的值是9,那麼這個矩形區域的值就是這兩個座標之間,也就是對應5的行標籤到9的行標籤,5的列標籤到9的列標籤,行列標籤之間用逗號隔開,行標籤與行標籤之間,列標籤與列標籤之間用冒號隔開,記住,.loc是用行列標籤來進行選擇數據的, 且前閉後閉

    那麼,我們會想,那我們只知道要第幾行,第幾列的數據呢,這該怎麼辦,剛好,.iloc就是幹這個事的。

  2. .iloc[]
    .iloc[]與loc一樣,中括號裏面也是先行後列,行列標籤用逗號分割,與loc不同的之處是,.iloc 是根據行數與列數來索引的,比如上面提到的得到數字5,那麼用iloc來表示就是data.iloc[1,1],因爲5是第2行第2列,注意索引從0開始的,同理4就是data.iloc[0,1],同樣如果我們需要選擇一個區域,比如我要選擇5,8,6,9,那麼用,iloc來選擇就是

    data.iloc[1:3,1:3]
    

    因爲5在第二行第二列,9在第三行第三列,注意此處區間前閉後開,所以是1:3,與loc不同的是loc前閉後閉,以及loc是根據行列標籤,而.iloc是根據行數與列數

  3. .ix[]
    .ix我發現,上面兩種用法他都可以,它既可以根據行列標籤又可以根據行列數,比如拿到5

    data.ix[1,1]
    data.ix["b","B"]
    

    上面兩種做法都可以的,同理選擇一個區域

    data.ix[1:3,1:3]
    data.ix['b':'c','B':'C']
    
    以上兩種方法都是取到5689
    

再詳細點的Pandas中loc和iloc函數用法詳解(源碼+實例)

2. pandas.set_index和reset_index

  • DataFrame可以通過set_index方法,可以設置單索引和複合索引。

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

  • keys:列標籤或列標籤/數組列表,需要設置爲索引的列
  • drop:默認爲True,刪除用作新索引的列
  • append:默認爲False,是否將列附加到現有索引
  • inplace:默認爲False,適當修改DataFrame(不要創建新對象)
  • verify_integrity:默認爲false,檢查新索引的副本。否則,請將檢查推遲到必要時進行。將其設置爲false將提高該方法的性能。
  • reset_index可以還原索引,從新變爲默認的整型索引

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

  • level:int、str、tuple或list,默認無,僅從索引中刪除給定級別。默認情況下移除所有級別。控制了具體要還原的那個等級的索引
  • drop:drop爲False則索引列會被還原爲普通列,否則會丟失
  • inplace:默認爲false,適當修改DataFrame(不要創建新對象)
  • col_level:int或str,默認值爲0,如果列有多個級別,則確定將標籤插入到哪個級別。默認情況下,它將插入到第一級。
  • col_fill:對象,默認‘’,如果列有多個級別,則確定其他級別的命名方式。如果沒有,則重複索引名

下面看操作:

import pandas as pd
df = pd.DataFrame({ 'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']})
df

df是一個正常的DataFrame結構:
在這裏插入圖片描述
下面把A列置成索引列:

drop_t = df.set_index('A',drop=True, append=False, inplace=False, verify_integrity=False)
drop_t

# 這樣就可以通過索引名和列名來訪問元素了
drop_t.loc["A0":"A2"]

在這裏插入圖片描述
drop=False, 這樣不會刪除原列

# drop=False, 不會刪除原列
no_drop_t = df.set_index('A',drop=False, append=False, inplace=False, verify_integrity=False)
no_drop_t

結果如下: 不過這個用的不多。
在這裏插入圖片描述
索引的還原: reset_index()

reset_drop_t = drop_t.reset_index(drop=False) #索引列會被還原爲普通列
reset_drop_t

reset_no_drop_t = no_drop_t.reset_index(drop=True) #索引列會被還原爲普通列
reset_no_drop_t

又回到了原來的樣子:
在這裏插入圖片描述

3. pandas.query

這個是字符串表達式查詢,基於DataFrame列的計算代數式。對於過濾的操作,可以使用query()方法。注意支持string,不支持布爾類型, 與query類似的一個函數是eval, 是使用字符串表達式來計算對DataFrame的操作,支持算術,比較,位,對象索引,列間計算等, 這倆都是高性能函數,後者遇到的時候再整理吧。

import pandas as pd
d={
    'name':['xiao','dan','qi'],
    'sex':['male','female','male'],
    'age':[23,24,24]
}
df=pd.DataFrame(d)

結果如下:
在這裏插入圖片描述

# df query('age'>23)  # 這個會報錯
df.query('age>23')

也是類似與選擇出pandas裏面符合條件的樣本。
在這裏插入圖片描述

好了,今天分享是pandas的三個小知識點,也是比較常用的一些基本操作, 來自於一個工業化工生產預測的比賽

一切從實用的角度出發。 希望能幫到您!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章