用了這麼久的pandas,但每次使用的時候須要靠網絡才能勉強度日(*╹▽╹*)。網絡
集中整理一下,常常用到但又容易搞混的功能。。。dom
1,、iloc與loc的用法與區別spa
#這兩個功能很是基礎,也常常會用到,並且每每能夠玩出不同的花樣~
#以該數據集爲例
import pandas as pd
import numpy as np
df = pd.DataFrame(np.array(list('abcd1abcd1abcd0abcd1abcd0badc0')).reshape(6,5),
index=range(6),columns=['A','B','C','D','E'])
A B C D E 0 a b c d 1 1 a b c d 1 2 a b c d 0 3 a b c d 1 4 a b c d 0 5 b a d c 0
#常規操做
【1】
df.loc[1]
A a B b C c D d E 1
df.iloc[1]
A a B b C c D d E 0
# 運行會發現,只返回一行的話,iloc和loc的結果都是同樣的
【2】
df.loc[1:4]
A B C D E 1 a b c d 1 2 a b c d 0 3 a b c d 1 4 a b c d 0
df.iloc[1:4]
A B C D E 1 a b c d 1 2 a b c d 0 3 a b c d 1
#這下稍有些不一樣,loc是閉區間返回,iloc是開區間返回,更符合通常的切片操做
【3】
df.loc[1:4,:3] #會報錯
df.loc[1:4,['A','B']] #能夠經過具體的列進行索引
A B 1 a b 2 a b 3 a b 4 a b
df.iloc[1:4,:3]
A B C 1 a b c 2 a b c 3 a b c
df.iloc[1:4,['A','B']]#會報錯
df.iloc[1:3,[3]] # 但能夠經過列標籤的索引切出單獨的列,或者用區間的形式
D 1 d 2 d 3 d
總結:
loc: 通常經過行標籤或者列標籤進行索引進行切片code
iloc:通常經過行索引或者列索引進行切片blog
df.iloc[:,df.columns!='E']
df.loc[:,df.columns!='E'] #兩者均可以經過這樣的方式進行切片,能夠用於feature與label的分離,但由於loc是閉區間切片,所以可能更適合
df.columns!='E' #返回的是一個布爾型的列表
df.loc[1:3,[True,True,True,False]] #所以也能夠這樣進行索引
A B C 1 a b c 2 a b c 3 a b c
二、隨機打亂DataFrame數據的排序排序
#以該數據及爲例
import pandas as pd import numpy as np
df = pd.DataFrame(np.array(list('abcdcbaceebcabcdacbeaabcbfnaeb')).reshape(5,6), index=range(5),columns=['a','b','c','d','e','f'])
pandas提供了sample的方法:
df = df.sample(frac=1).reset_index(drop=True) #加上reset_index是爲了讓隨機打亂的樣本仍是按照正常的順序進行排序,若是要保留打亂的索引,不加便可
運行結果以下:
a b c d e f 4 b f n a e b 2 a b c d a c 1 a c e e b c 3 b e a a b c 0 a b c d c b
這裏還能夠設置要返回的比例,好比df中有10行數據,我只想返回其中的40%,那麼frac=0.4
df = df.sample(frac=0.4).reset_index(drop=True)
a b c d e f 0 a c e e b c 1 a b c d a c
延伸:固然還有其餘方法,好比利用sklearn庫,或者利用numpy
from sklearn.utils import shuffle
sk = shuffle(df).reset_index()
np = df.iloc[np.random.permutation(len(df))]
未完待續。。。索引