今天整理的三個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
-
.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就是幹這個事的。 -
.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是根據行數與列數
-
.ix[]
.ix我發現,上面兩種用法他都可以,它既可以根據行列標籤又可以根據行列數,比如拿到5data.ix[1,1] data.ix["b","B"]
上面兩種做法都可以的,同理選擇一個區域
data.ix[1:3,1:3] data.ix['b':'c','B':'C'] 以上兩種方法都是取到5,6,8,9
再詳細點的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的三個小知識點,也是比較常用的一些基本操作, 來自於一個工業化工生產預測的比賽。
一切從實用的角度出發。 希望能幫到您!