思维导图:Numpy+Pandas
整理自:莫烦Python
附:文本结构
Numpy+Pandas
Numpy
基于矩阵运算的模块
数组转矩阵
A = np.array([[1,2,3],[2,3,4]])
矩阵属性
ndim
维度
shape
形状
size
元素个数
创建矩阵
array
数组形式初始化
dtype
int
int32
float
float32
ones
全1的矩阵
zeros
全0的矩阵
empty
所有元素都接近0的矩阵
np.random.random
随机生成指定形状的矩阵
arange
(start , end , step)
区间
[start,end)
步长
step
默认为 1
linspace
(start , end , num)
区间
[start,end]
点的数量
num
reshape
变形
基本运算
加减
N次方
A**N
普通乘法(同位置元素相乘)
*
矩阵乘法(前者的行元素乘后者的列元素)
写法1
np.dot(A, B)
写法2
A.dot(B)
基本运算2
sum、min、max
axis=0
按列计算
axis=1
按行计算
默认不设置axis
对全部元素
argmin、argmax
求最值的索引
mean、average
求均值
median
中位数
cumsum
累加
[1,2,3,4]=>[1,3,6,10]
diff
累差
[1,2,3,4]
[1,1,1]
后项与前项的差值
nonzero
找出非零项,并将N维度索引分开成N个一维矩阵表示
sort
从小到大排序
可控制axis,默认是axis=1(行)
转置
方法1
A.T
方法2
np.transpose(A)
clip(Array, Array_min, Array_max)
将超出边界的值调整为指定的边界值,未超出的值继续保持原值
索引
表示方式
A[I][j]
A[i, j]
切片操作
start:end
A[2,3:5]
行索引为2,列索引为区间[3,5)
A[:,:5]
前5列的所有数据
A[:5]
前五行的所有数据
开始索引:结束索引
空值代表边界值
::n
A[::3]
跳步,每3个数取第一个数
A.flatten()
展开为1维矩阵
A.flat
是一个迭代器
for a in A.flat
遍历元素
合并
np.vstack(A,B)
纵向合并
[[A],[B]]
np.hstack(A,B)
横向合并
[A,B]
np.concatenate((A,B,B,A),axis=1)
多个矩阵纵向合并
np.concatenate((A,B,B,A),axis=0)
多个矩阵横向合并
一维矩阵(n个元素)的转置
先转成二维
shape=(1,n)
A[np.newaxis,:]
A.reshape(1,A.size)
shape=(n,1)
A[:,np.newaxis]
A.reshape(A.size,1)
再进行转置
newA.T
分割
等量分割
纵向分割
np.split(A,2,axis=1)
np.vsplit(A,2)
横向分割
np.split(A,2,axis=0)
np.hsplit(A,2)
每个分块必须等量,否则报错
不等量分割
纵向分割
np.array_split(A,2,axis=1)
横向分割
np.array_split(A,2,axis=0)
分块可不等量
赋值
浅拷贝
B=A
B和A是同一个对象,变化同步
深拷贝
B=A.copy()
B和A是不同对象,变化不同步
Pandas
主要两个数据结构
Series
pd.Series(indexA,valueA)
左边索引,右边值
pd.Series(valueA)
不配置索引,则索引从0开始++
DataFrame
每个列的类型可不同
df = Pandas.DataFrame(value, 行索引标签, 列索引标签)
value
二维数组或矩阵
行索引标签
行索引,类似数据库表的行号
列索引标签
列索引,即表头,类似数据库表的字段名
df = Pandas.DataFrame(value)
自动生成索引
df[‘列标签’]
按列索引取出一列
df.index
df.columns
df.value
df.describe()
数据情况
df.sort_index(axis=1, ascending=False)
对索引排序,升序
ascending=True为降序
df.sort_values(by=‘列标签’)
对某列值排序
常用方法
pd.date_range('20160101',periods=6)
生成6个日期
选择数据
df[位置:位置]
[s,e)
df[‘标签’:‘标签’]
[s,e]
df[‘列标签’] = df.column
选择某列
df.loc(‘行标签’,‘列标签’)
根据标签,选择某行,某列
可配合 : 使用
df.iloc(行位置,列位置)
根据位置,选择某行,某列
可配合 : 使用
df.ix(行位置,‘列标签’)
混合标签和位置,选择某行,某列
可配合 : 使用
df[df.‘列标签’<8]
使用判断进行筛选
修改数据
选择数据=新赋值
新增数据
df[‘newColumn’]=pd.Series(......)
为DataFrame添加一列新Series
长度需要对齐
删除NaN的数据
df.dropna(axis=0,how=‘any’)
将有NaN值的行删除
df.dropna(axis=1,how=‘all’)
将整列全是NaN的列删除
替换NaN的数据
df.fillna(value=0)
将NaN替换成0
判断是否是NaN
df.isnull()
对每个元素分别进行判断
pd.any(df.isnull)
含有NaN就是True
读取文档
data = pd.read_csv(‘filepath’)
读取csv
支持的格式
csv
Excel
json
html
pickle
......
data. to_pickle(‘data.pickle’)
转成pickle持久化数据存在磁盘
合并
np.concat([df1, df2, df3], axis=1, ignore_index=True, join=‘inner’)
默认axis=0
纵向
默认ignore_index=False
索引会重复
默认join=‘outer’
外连接,不抛弃对不上号的部分
内连接则会抛弃
join_axes = [df1.index]
依据df1的index进行合并
df1没有的部分将被抛弃
df1.append([df2, df3])
只有纵向合并
np.merge(left, right, on=[‘key1’, ’key2’], how=‘left’)
类似数据库的leftTable left join rightTable on leftTable.key1=rightTable.key1 and ...
how
inner
默认
outer
left
right
indicator=True
会把合并情况放在最后一列
indicator=‘命名’
会把合并情况放在最后一列,并给出列名
suffixes=['_boy', '_girl']
为标签添加后缀
区分数据所属,防止标签重叠
pd.merge(left, right, left_index=True, right_index=True, how='outer')
根据索引号合并
画图
import matplotlib.pyplot as plt
plt.plot([xx],[yy])
设置方式1
data = pd.Series()
data.plot()
设置方式2
data = pd.DataFrame
plt.show()
渲染
图类型
plot.scatter
plot.bar
plot.box
plot.hist
plot.area
plot.kde
plot.hexbin
配置
ax = data.plot.scatter(x='A',y='B',color='DarkBlue',label='Class1')
data.plot.scatter(x='A',y='C',color='LightGreen',label='Class2',ax=ax)
ax=ax
将此图画在ax同一张画布上
计算速度优化
矩阵存储方式选择
order=‘C’
C-type以行为主在内存中排列
order=‘F’
Fortran以列为主在内存中排列
根据使用的级别是行是列,进行选择
view比copy快
能不copy就不copy
ravel是flatten的view方式,快很多
一个个选是copy
:是view
::也是view
加法性能对比
a = a + 1
最慢
是copy,并且要转到下一步np.add再进行运算
np.add(a, 1)
稍快
是copy
a += 1
更快
是view
np.add(a, 1, out=a)
最快
是view
numpy比pandas速度快
pandas是基于numpy的扩展