用了这么久的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))]
未完待续。。。索引