python - 啃书 第七章 模块、包和库 (二)

常用第三方库

Pandas

Pandas 中文网

Pandas是基于NumPy库的一种解决数据分析任务的工具库

Pandas库纳入了大量模块和一些标准的数据模型,提供了高效的操作大型数据集所需的工具

Pandas库的主要功能有:
创建Series(系列)和DataFrame(数据帧)、索引选取和过滤、算术运算、数据汇总和描述性统计、数据排序和排名、处理缺失值和层次化索引等

系列 Series

系列与NumPy库中的一维数组(array)类似,能保存字符串、Bool值、数字等不同的数据类型

创建格式:pands.Series(data,index,dtype,copy)
data:数据,采取各种形式,如ndarray、list、constants等
index:索引值,必须是唯一的和散裂的
dtype:数据类型
copy:复制数据,默认为False

import pandas as pd
import numpy as np
data=np.array(['需求分析','概要设计','详细设计','编制代码','运行维护'])
s=pd.Series(data)
print(s)
#
0    需求分析
1    概要设计
2    详细设计
3    编制代码
4    运行维护
dtype: object

从字典创建一个系列

import pandas as pd
d={
   'A':"优秀",'B':"良好",'C':"合格",'D':"不合格"}
s=pd.Series(d)
print(s)
print("s[0]:",s[0])
print("s['A']:",s['A'])
print("s[0]'s key:",s.index[0])
#
A     优秀
B     良好
C     合格
D    不合格
dtype: object
s[0]: 优秀
s['A']: 优秀
s[0]'s key: A

与字典的不同之处,索引方面,pd既可以用index索引,又可以用key索引。而字典只能用key索引。

但是效率方面还是字典更高一筹

"D" in d # 49.7 ns
"D" in s # 799 ns
"不合格" in d.values() # 237 ns
"不合格" in s.values # 6.54 µs

那么Series的意义:
pandas 学习(1): pandas 数据结构之Series
里面介绍到pandas同时拥有字典和数组的结构,算是融合了两者的使用,又增加了字典没有的index索引,和对齐输出。

那么就只看看对齐输出这项!

%%timeit
d={
   'A':"优秀",'B':"良好",'C':"合格",'D':"不合格"}
s=pd.Series(d)
print(s)

883 µs / noprint 214 µs

那么字典实现对齐输出呢
字典一般是这种模式:可以考虑字符替换,但无法保证对齐,也可以考虑,循环输出
{‘A’: ‘优秀’, ‘B’: ‘良好’, ‘C’: ‘合格’, ‘D’: ‘不合格’}

A                        优秀
B                        良好
C                        合格
DDDDDDDDDDDDDDDDDDDD    不合格
dtype: object
%%timeit
l=0
for i in d:
    if len(i)>l:l=len(i)
for i in d:
    print(i+" "*(l-len(i)),1)

补空格法,886 µs

%%timeit
l=0
for i in d:
    if len(i)>l:l=len(i)
for i in d:
    exec("print('%%-%ds 1'%%i)"%l)

exec + %-10s法,514 µs,因为不知道如何实现变量,突然想,如果exec在for外面的话
518 µs ,好奇并没有变化,推测exec和自定义函数变量一样,只生效第一次,不在变化,看似他在for里面,可能只执行了一次,而不是每次都执行!?

但是如果key中有中文的话,这个方法就不行了,但其实pd也并不能完美显示的样子

A           优秀
B           良好
1111        合格
ddddD瓦房    不合格

这里不再讨论对齐这个事情,接着啃书,计算unicode的个数快呢,还是使用decode快呢!?

数据帧(DataFrame)

数据帧是二维的表格型数据结构,即数据以行和列的表格方式排列。与系列相比,数据帧使用得更普遍。
pandas.DataFrame(data,index,columns,dtype,copy)
data: 数据,可以是各种类型,如ndarray、series、lists、dict、constant、DataFrame等
index,columns: 分别为行标签和列标签
dtype: 每列的数据类型
copy: 复制数据,默认值为False

从列表创建DataFrame

import pandas as pd
data=[['Tom',3],['Jerry',1]]
df=pd.DataFrame(data,columns=['Name','Age'])
print(df)
#
    Name  Age
0    Tom    3
1  Jerry    1

访问:
(1)df[r,c]: row: 行 column: 列 ???运行失败
(2)df.loc(r,c): 基于标签访问数据,函数中的r和c分别为行标签和列标签
(3)df.iloc(r,c): 基于整数访问数据,函数中的r和c分别为行标签索引和列标签索引

import numpy as np
import pandas as pd
df=pd.DataFrame(np.arange(9).reshape((3,3)),index=['A','B','C'],columns=['one','two','three'])
df
#
	one	two	three
A	0	1	2
B	3	4	5
C	6	7	8

df[1:2]
# columns是一直显示的,index只决定哪一行会显示
	one	two	three
B	3	4	5

df[['three','one']]
#
	three	one
A	2	0
B	5	3
C	8	6

df[['three','one']][1:2]
# 如果再分的细一点呢,但我觉得应该有更好的方法,530 µs  df[1:2][['three','one']],556 µs
	three	one
B	5	3

df[df['three']>5]
	one	two	three
C	6	7	8

df.loc['A','two']
#
1

df.loc['A']
one      0
two      1
three    2
Name: A, dtype: int32

df.loc['A':'B','one':'two']
	one	two
A	0	1
B	3	4

df.loc[['A','B'],['one','three']]
	one	three
A	0	2
B	3	5
df.loc['B',['three','one']]
three    5
one      3
Name: B, dtype: int32
468 µs

df.iloc[1,1]
#
4

df.iloc[1]
#
one      3
two      4
three    5
Name: B, dtype: int32
df.iloc[1:2]
	one	two	three
B	3	4	5
df.iloc[[1,2]]
	one	two	three
B	3	4	5
C	6	7	8
df.iloc[1,2]
5

pandas的DataFrame的行列选择

pandas 获取不符合条件/不包含某个字符串的dataframe

SciPy库

SciPy库是一款方便、易于使用、专为科学和工程设计的工具库,包括统计、优化、整合、线性代数、傅里叶变换、信号和图像处理、常微分方程求解等

scipy库中的模块很多,不同模块的功能相对独立,如scipy.constants(数学常量),scipy.fftpack(快速傅里叶变换)、scipy.integrate(积分)、scipy.optimize(优化算法)、scipy.stats(统计函数)、scipy.special(特殊数学函数)、scipy.signal(信号处理)、scipy.ndimage(N维图像、图像处理)模块等
维度:dimension

constants模块

from scipy import constants as con
con.hour
3600.0
con.c
299792458.0
con.inch
0.0254
con.degree
0.017453292519943295
con.golden
1.618033988749895

除了这些常数之外,还提供了诸多转换、计算方法。

special模块

from scipy import special as sp
sp.cbrt(27)
1.28 µs
pow(27,1/3) #精度不足
223 ns
sp.sindg(30) # 角度正弦
0.49999999999999994 # 又精度不足?
sp.comb(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值