python cookbook是什么_Python Cookbook (3)

1. 导入库:import pandas as pd

2. Series对象: # 类似于数组,用来表示一位数据结构

(1) 创建:s=pd.Series([12,-4,7,9]) # 注意首字母大写哟!输出时一列标签,如果不指定则默认从 0开始递增,右侧是标签对应的元素

s=pd.Series([12,-4,7,9],index=['a','b','c','d']) # 通过后面的 index来指定标签

如果要分别查看索引和元素,可分别调用s.index和s.values

(2) 选择内部元素:

(a) 位置索引:当做NumPy数组即可,比如s[2]输出为7,s[0:2]输出为a 12 b -4 dtype:int64 # 注意后者切片操作输出的是完整部分

(b) 标签索引:s['b']输出为-4,s[['b','c']]输出为b -4 c 7 dtype:int64 # 综上可以看出,引用多个时输出包含的内容更多

(3) 为元素赋值:

(a) 位置赋值:s[1]=0

(b) 标签赋值:s['b']=1

(4) 用字典、NumPy数组或其他Series对象来定义新Series对象:s3=pd.Series(arr),其中arr是一个已经定义好的字典、NumPy数组或Series对象

# 注意!如果改动原来对象,那么新的Series对象也会跟着边哟~

(5) 筛选元素:就数据结构而言,NumPy数组的多种操作方法可以扩展到Series对象中

(6) 运算符和其他数学函数:NumPy数组的多种操作方法可以扩展到Series对象中

(7) 元素统计:

(a) unique()函数:返回一个数组,包含Series去重后的元素,s.unique() # 注意返回数组中的元素顺序是随意的

(b) value_counts()函数:返回各个不同的元素及其出现次数,s.value_counts()

(c) isin()函数:判断给定的一列元素是否包含在数据结构之中,返回布尔值,s.isin([0,3])

# 输出的是标签+布尔值,即挨个遍历每个标签,看是否包含给定元素

(8) NaN值处理:

(a) 可为数组中元素缺失的项输入np.NaN,比如s2=pd.Series([5,-3,np.NaN,14])

(b) isnull()和notnull()函数:输出标签+布尔值,即挨个判别标签是否对应NaN值

# 这个函数挺好用的,数据分析中对数据预处理就要剔除空值,这里比如 s1=s[s.notnull()]就能实现筛选

(9) 对象间的运算:与之前所学一样可以拓展

# 注意到运算符+有独特的优势,能够通过识别标签对齐不一致的数据,残缺的自动补NaN值

3. DataFrame对象: # 将Series的使用场景由一维拓展到多维。其实就是cpp stl里面的multi列表结构

(1) 创建:可以首先创建个字典data={'color':['blue','green','yellow'],'object':['ball','pen','pencil'],'price':[1.2,1.0,0.6]}

# 还可以用嵌套字典生成DataFrame对象

然后既可以用字典data来生成frame=pd.DataFrame(data)了,还可以筛选特定列,比如frame=pd.DataFrame(data,columns=['object','price']

同样,可以指定index,比如frame=pd.DataFrame(data,index=['one','two','three']) # 如果不指定则同样默认从0开始递增

此外,还可以更灵活地直接定义,比如frame=pd.DataFrame(np.arange(4).reshape((2,2)),index=['red','blue'],columns=['ball','pen'])

(2) 读取元素:

(a) 读取列名、索引和值:frame.columns、frame.index和frame.values

(b) 读取指定列:frame['price']或frame.price

(c) 读取指定行:frame[0:1],frame[1:3] # 类似于切片操作

(d) 读取某一个元素:frame['object'][3] # 指定列名+index即可

(3) 赋值:

(a) 添加新列:frame['new']=[3.0,1.3,2.2,0.8,1.1],如果新列元素值相同则frame['new']=12即可 # new是新列的名称

还能更灵活,比如实现定义好ser=pd.Series(np.arange(5)),然后再frame['new']=ser即可

# 关于添加行的操作在后面的11.3拼接有列举

(b) 修改单个元素:frame['price'][2]=3.3

(4) 元素的所属关系:frame.isin([1.0,'pen']),同样按索引值一个个遍历输出布尔值,矩阵除index外的的每个元素都参与

(5) 删除一列:del frame['new'],给列名就行

(6) 筛选:不赘述,同NumPy,比如frame[frame<12],矩阵除index外的每个元素都参与,不符合的元素被替换为NaN

(7) 转置:frame.T

4. Index对象: # by the way, index 对象是不能改变的,但可以执行“更换索引”操作

(1) 返回首/尾元素:ser.idxmin()/ser.idxmax()

(2) 判别重复:serd.index.is_unique,返回布尔值

(3) 更换索引:

(a) ser.reindex(['three','four','five','one']),新增index对应元素默认赋值为NaN

# 用这种纯手工的办法,同时能删除和调整位置,reindex函数中不包含的index及其元素被删除

(b) ser.reindex(range(6),method='ffill'),新增index对应元素为前面索引编号比它小的那一项的元素

(c) ser.reindex(range(6),method='bfill'),新增index对应元素为后面索引编号比它大的那一项的元素

(d) 对于FataFrame数据结构,除上示外还可以更换列索引

(4) 删除索引:ser.drop('索引名'),对于DataFrame,对行操作为frame.drop('标签名'),对列操作为frame.drop('标签名',axis=1)

同样,如果想一次对多个操作,则用数组最为参数即可,比如 ser.drop('标签名1','标签名2',axis=1)

5. Series和DataFrame对象之间的运算:可以看做是一个数组和一个矩阵的运算,index对应着来

6. 函数: # 因为 pandas是从 numpy扩展过来的,因此这里的函数功能可以参见 numpy的函数功能

(1) 调用自定义函数的方法:frame.apply(f),其中f是自定义的函数,用apply来调用

# 如果需要处理列,则frame.apply(f,axis=1)即可

(2) 一个比较好使的统计函数:describe(),能够一次性计算和输出多个统计量

7. 排序和排位次:

(1) sort_index()函数:

(a) 按index排序:ser.sort_index()默认为升序,ser.sort_index(ascending=False)则设置为了降序,对DataFrame,同样默认为按行进行,指定axis=1则为按列

(b) 按列排序:frame.sort_index(by='列名1'[,'列名2'...]),即通过by来指定就ok了

(2) order()函数:

(a) 它是针对Series对象按列排序的,不同于DataFrame,Series仅有一列,所以用order()就ok了

(3) rank()函数:

(a) 按排序后的位次排序:ser.rank() # 即对每个index的位次进行排序,即数据结构中的第1个index在排序后排第几,第2个index在排序后排第几

(b) 按未排序时的数据结构中的顺序排序:ser.rank(method='first')

# 升序降序的默认和设置方法同之前一样

8. 相关性和协方差:

(1) Series对象:ser1.corr(ser2)和ser1.cov(ser2)分别计算ser1和ser2的相关性和协方差

(2) DataFrame对象:frame.coor()和frame.cur,同样按行按列有axis决定,比如列为1,2,3,4,则返回4*4的矩阵,第i行是第i个列名分别于其他列的相关性或协方差,也包括自己和自己的

(3) DataFrame和Series间:frame.corrwith(ser)即frame的列或行与Series对象或其他DataFrame对象元素两两之间的相关性

# 注意,pandas在计算各种描述性统计量时其实没有考虑NaN值

9. NaN数据的处理:

(1) 为元素赋NaN值:ser=pd.Series([0,np.NaN,3],index=['one','two','three']),即同np.NaN就ok了

(2) 过滤NaN:

(a) Series对象:ser.dropna()或ser[ser.notnull()],前者动了数据结构,而后者木有,后者相当于按过滤要求返回了一个特定的视图

(b) DataFrame对象:dropna()函数会将哪怕只有一个元素为NaN的行或列都进行删除,为了避免,则使用frame.dropna(how='all'),即所有元素都为NaN时才执行

(3) 为NaN元素填充其他值:frame.fillna(0),即将所有的NaN替换为0,或frame.fillna({'ball':1,'mug':0,'pen':99})则指定了每个index下NaN值得替换值

# 因为直接删除NaN可能会删除跟数据分析相关的其他数据,不如用其他值替代,比如C里面就是这个套路,令inf=999999999...

10. 等级索引和分级

(1) 创建:对于Series对象,mser=pd.Series(np.random.rand(5),index=[['white','white','white','blue','blue'],['up','down','right','up','down']])

对于DataFrame对象,mframe=pd.DataFrame(np.random.randn(16).reshape(4,4),index[['white','white','red','red'],['up','down','up','down']],columns=[['pen','pen','paper','paper'],[1,2,1,2]])

(2) 读取:

(a) mser['white']选取第一列作为index,那么读取内容包含第二列index和值

(b) mser[:,'up']选取第二列作为index,那么读取内容包含第一列index和值

(c) mser['white','up']选取某一特定元素,读取内容是对应的具体值

(3) 转换为DataFrame对象:mser.unstack(),那么第一级作为行名,第二级作为列名了

# 不难发现,同样可以将DataFrame对象转换为Series对象,用frame.stack()即可完成操作

(4) 重新调整顺序和为层级排序:

(a) 互换DataFrame两个层级的名称:mframe.swaplevel('层名1','层名2')

# 注意得先赋予层级名称,mframe.columns.names=['列名1','列名2'],mframe.index.names=['index名1','index名2']

(b) 只根据一个层级对数据排序:mframe.sortlevel('层名')

(5) 按层级统计数据:函数还是之前学的那些函数,只不过现在可以指定层级了,比如mframe.sum(level='层名'),若想对某一层级的列进行统计,则新指定一个axis=1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值