Numpy介绍
安装方法和引用方法
- pip install numpy
- import numpy as np
使用展示(包括random使用)
random.uniform(参数1,参数2) 在1到2之间生成浮点数
random.uniform(100.0,200.0) 随机生成100到200的浮点数
random.randint(参数1,参数2) 随机生成1到2的整数类型
np.array(列表) 将列表转换为numpy数组
ndarray 多维数据对象
- 创建 ndarray: np.array(array_like)
- 对象.dtype() 查看对象的类型
- np.array([[1,2,3],[4,5,6]]) 多维数组
- 对象.size 有多少个元素
- 对象.shape 返回几行几列(1,2)1行2列
- T 数组的转置(对高维数组而言)
- .ndim 查看当前维数
ndarray-创建
array()将列表转换为数组,可选择显示指定dtype
arange()range的numpy版,支持浮点数
-
arange(100) # 取0-99的数据 arange(0,10) # 取0-9 arange(2,10,3) # 从2到10 每个间隔3(起始值,结束值,步长) # 步长可以给小数
reshape(行,列) 创建几行几列的二维数组
-
a = np.arange(20).reshape(4,5) # 创建4行5列 范围为0-19的二维数组 [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]]
linspace()类似arange(),第三个参数为数组长度
-
linspace(起始值,结束值,长度) linspace(0,10,100) # 数组范围0-10 分为100份
zeros()根据指定形状和dtype创建全0数组
-
a = np.zeros(10,dtype='数据类型') 创建10个**类型的列表
ones()根据指定形状和dtype创建全1数组
empty()根据指定形状和dtype创建空数组(随机值)
eye()根据指定边长和dtype创建单位矩阵
ndarray-数据类型
- 布尔型:bool_
- 整型:int_ int8 int16 int32 int64
- 无符号整型: uint8 uint16 uint32 uint64
- 浮点型: float_ float16 float32 float64
- 复数型:complex_complex64 complex 128
数组与列表的区别
- 数组对象内的元素类型必须相同
- 数组大小不可修改
ndarray-批量运算
- 数组和标量之间的运算
- a+1 ,a*3 ,1//a,a**0.5 a>5
- 同样大小数组之间的运算
- a+b,a/b.a**b,a%b,a==b
索引和切片
索引[行,列] 而 pandas对象是[列,行]
- 一维数组的索引:a[5]
- 多维数组的索引:列表式写法:2[2][3]新式写法:a[2,3]、
切片
a[起始位置:4] 从起始位置切4个
-
[[1,2,3,4,5,6,7,8] a[0:4] # 得出的值为 1 2 3 4 a[4:] # 从4开始切所有 [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] a[0:2,0:2] 行从0切2行 列从0切2列
0行开始 切片就是从0开始,1行开始就是从1
一维数组的切片:a[5:8] 从第5-1行切8列, a[4:] 从4-1行切全部列,a[2:10] = 1 将从第2行切10列的值变为1
多维数组的切片:a[1:2,3:4] ,a[:3:5],a[:,1]
数组切片与列表切片的不同:数组切片时并不会自动复制(而是创建一个视图),在切片数组上的修改会影响原数组。
copy方法可以创建数组的拷贝
布尔索引
a[a>5] 返回a大于5的数组列表
-
print(a[a>3]) # 取a>5 b = a[a>3] print(b[b%2==0]) # 取偶数
ndarray-花式索引
a = np.arange(10)
a = [1,2,3,4,5,6,7,8,9]
# 我要取1 3 4 6 7 没有规律怎么办
# 花式索引
b = a[[1,3,4,6,7]]
a[0,2:4] # 0-2然后从2的位置取到4的位置
a =
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
# 取 6 8 16 18
print(a[[1,3],:][:,[1,3]]) # 先取第一行和第三行全部列,然后取全部行,第1列和第3列。
[[ 6 8]
[16 18]]
a = [行,列]
ndarray通用函数
abs()返回绝对值
numpy.sqrt(array[, out])函数用于按元素确定数组的正平方根。
round() 四舍五入
np.floor() 向下取整
np.ceil()向上取整
np.maximum(a,b)
-
a = np.array([2,5,3,4]) b = np.array([5,2,1,6]) print(np.maximum(a,b)) # 对比2个数组一一对比,返回最大值
np.mininum(a,b) 返回最小值
Numpy统计
- sum() 求和
- mean() 求平均值
- min() 求最小值
- max ()求最大值
- var()方差
- std() 标准差,方差再开一个根
- argmax()返回最大值索引
- argmin()返回最小值索引
Numpy-随机数生成
random.rand 给定形状产生随机数组(0到1之间的数)
random.randint(起始值,结束值,个数) 给定形状产生随机整数
-
random.randint(起始值,结束值,(3,5)) 3行5列的二维数组
random.choice 给定形状产生随机选择
random.shuffle 与random.shuffle相同 打乱一个数组
random.uniform 给定形状产生随机数组
histogram()函数
统计区间中的数量
列如: a1 = [1,2,4,1,8,9]
np.linspace(1,10,4) 取1到10然后划分3给区间
np.histogram(a1,np.linspace(1,10,4))
区间1-4-7-10
1-4中a1有[1,2,1] 3个
4-7中a1有[4] 1个
7-10中a1有8,9 2个
series介绍
series
series是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成
创建方式
-
a = pd.Series([4,7,-5,3]) 0 4 1 7 2 -5 3 3 b = pd.Series([4,7,-5,3],index=['a','b','c','d'])a 4 b 7 c -5 d 3
获取之数组和索引数组:values属性和index属性
Series比较像列表(数组)和字典的结合体
可以和数进行运算,比如2给相同大小的series对象相加
也可以切片 a[0:2] a[起始位置,切几个]
a[a>4] 布尔值过滤
通用函数 np.abs(a)
-
sr = pd.Series({'a':1,'b':2}) print(sr) a 1 b 2 # 可以用字典创建 # 可以通过字典key值获取 # 判断一个键是否在字典里 'a' in sr: True
index 索引属性 values值属性
sr['a':'c'] 切片
Series-整数索引
sr = pd.Series(np.arange(20))
print(sr)
sr2 = sr[10:].copy()
print(sr2)
print(sr2[10]) # 会解释成标签,与索引相混乱
# 使用loc 用标签获取不用索引
print(sr2.loc[10])
# 使用iloc 用下标获取
print(sr2.iloc[0])
Series-数据对齐
pandas在进行两个series对象的运算时,会按索引进行对齐然后计算
c+c a+a d+d
如果有sr1与sr2 相加索引有对不齐的会产生NaN值
fill_value 如果sr1+sr2加上有对应不上的,按有的值进行填充空值,如果都没有则填充为0
- sr.isnull() 判断sr里面有没有空值 有会Ture 没有为False
- sr.notnull() 与isnull()相反
- sr.dropna() 把缺失值扔掉
- sr.fillna(0) 所有NaN的值会变成0 sr.fillna(sr.mean()) 把NaN替换为平均值
Series-小结
- 数组+字典
- 整数索引 loc(解释为标签)和iloc(解释为索引)
- 数据对齐 NaN
- 缺失数据处理 dropna fillna
DataFrame对象
DataFrame对象常用属性
index 获取索引
T 转置 把行和列相互替换
one two 0 1 4 1 2 5 2 3 6 0 1 2 one 1 2 3 two 4 5 6
columns 获取列索引
values 获取值数组(二维数组)
describe() 获取快速统计
DataFrame获取值(先选列在选行)
-
one two 0 1 4 1 2 5 2 3 6 df["one"]["0"] # 返回的就是第0行的one列 # 推荐使用 loc 和 iloc print(frame.loc[0,'one']) # loc和iloc是先取行在取列 # 取第0标签的所有值 print(frame.loc[0,:]) one 1 two 4
DataFrame-索引和切片
花式索引同样适用
# 取第0行和第2行,two列的值
print(frame.loc[[0,2],'two'])
0 4
2 6
DataFramed-数据对齐与缺失处理
# 对齐,如果没有值则为NaN
frame = pd.DataFrame({'one':[1,2,3],'two':[4,5,6]},index=[0,1,2])
frame2 = pd.DataFrame({'one':[1,2,3,5],'two':[4,5,6,7]},index=[1,0,2,3])
print(frame)
print(frame2)
print(frame+frame2)
one two
0 1 4
1 2 5
2 3 6
one two
1 1 4
0 2 5
2 3 6
3 5 7
one two
0 3.0 9.0
1 3.0 9.0
2 6.0 12.0
3 NaN NaN
- fillna(0) 缺失值填充与Series对象一样
- drop() 删除行或者列
- dropna() 如果行里面有一个缺失值,就删除整行
- dropna(how='all') 如果一样所有的值都为NaN就删除
- how默认值为any 只要有NaN,就删除整行
- dropna(axis=0) 默认为0 行,axis=1列与其他的axis是相反的
Pandas常用方法
mean(axis=0,skipna=False) 对列(行)求平均值
axis = 0列 = 1 行 0就是跨行 1就是跨列
sum(axis=0) 对列(行)求和
sort_values(by='列名/行',ascending=T/F,axis=0/1) 对值按列名升序排序 ,降序加上ascending = False为降序
sort_index(axis,...,ascending=T/F) 对列(行)索引排序
drop 和 dropna 默认删除某一行axis=1 与其他函数相反
Numpy的通用函数同样适用于Pandas
pandas时间对象处理
- 时间对象库:datetime
- 灵活处理时间对象:dateutil.parser.parse()
- 成组处理时间对象:pandas pd.to_datetime()
- datetime.datetime.strptime('2020-01-01','%Y-%m-%d') 将字符串转化为时间对象(2020,1,1,0,0)
- dateutil库 dateutil.parser.parse('2020-01-01') 直接转换,(2020,1,1,0,0)
- pandas.to_datetime(['2020-01-01','2021-01-01']) 转换为DatetimeIndex(['2020-01-01','2020-02-02'])
生成时间对象(Timestamp类型)
date_range
start 开始时间
end 结束时间
periods 时间长度
freq 时间频率 默认为‘D’,可选H(our)、W(eek)、B(usiness)、S(emi-)M(onth),(min)T(es),S(econd),A(year)
- pd.date_range('日期1','日期2') 生成日期1到日期2的的时间
- pd.date_range('日期',periods=60) 生成从日期开始到第60天结束
- pd.date_range('日期',periods=60,freq='H') 按小时生成
- freq = 'W' 按周 ,'W-MON' 按周一
- frea='B' 工作日
- 对象.topydatetime()将对象转换为日期类型
Pandas文件处理
- pd.read_csv (‘路径’)默认分隔符为逗号
- pd.read_table(‘路径’) 默认分隔符为制表符
- 指定某一列作为行索引 index_col="列名/0"
- parse_dates=True 解析时间序列 parse_dates['列名']指定列变成时间对象
- header=None 自动生成列名,names=[‘内容’] 指定生成定列名
- na_values=[‘None’] 指定那些字符串表示缺失值
- sep 指定文件分隔符
- na_rep 指定缺失值转换的字符串,默认为空字符串
- header= False 不输出列名一行 index=False 不输出行索引一列
- colums =[0,1,2,3]指定输出的列,传入列表