pandas常用操作,你想要都在这里。。。
用了这么久的pandas,但每次使用的时候需要靠网络才能勉强度日(*╹▽╹*)。
集中整理一下,经常用到但又容易搞混的功能。。。
1,、iloc与loc的用法与区别
#这两个功能非常基础,也经常会用到,而且往往可以玩出不一样的花样~
#以该数据集为例
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: 一般通过行标签或者列标签进行索引进行切片
iloc:一般通过行索引或者列索引进行切片
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
2、随机打乱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))]
未完待续。。。