目录
numpy
1. 简介
(1)应用优势
快速:因为基于c语言,并且应用到了矩阵的计算,所以要比python中自带的list或者dict要快很多。
numpy类似于list,pandas类似dict,基于numpy是其升级版本。
(2)假如有matlab基础可以很容易入手。
2. 导入
import numpy as np
3. 初始化
(1)一般形式
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
dtype包括int(默认int64)、float(默认float64)等;
举例:
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6]])
(2)特殊形式
np.zeros(shape)
np.ones(shape)
np.empty(shape)
np.arange(start, end, step).reshape(shape) # 类似range()
np.linspace(start, end, size).reshape(shape)
import numpy as np
print(np.ones([1, 2]))
注:注意shape是一个列表,而不是两个参数。
4. 属性
np.array()创建的对象的属性包括维数(dimension)、形状(shape)、大小(size)
举例:
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6]])
print(arr.ndim) # 2
print(arr.shape) # (2, 3)
print(arr.size) # 6
5. 基础运算
(1) 算数运算
+-*/ ** 是矩阵中的数字逐个进行运算。
(2)比较运算
> < >= <= == 返回bool矩阵
假如需要整型矩阵,那么采用以下方法转换为int类型:
https://ask.helplib.com/python/post_1052836
(3)矩阵运算
np.dot(arr1, arr2) # arr1.*arr2
(4)其他运算
np.sum(arr, axis) np.min(arr, axis) np.max(arr, axis)
np.argmin(arr)/np.argmax(arr) # 返回最小/最大值的索引
np.mean(arr)/np.average(arr) # 求平均值
np.median(arr) # 返回中位数
np.cumsum(arr) # 累加,返回的不是一个数,而是一个矩阵,代表该位置之前的所有数值加和。
np.diff(arr) # 累差,返回一个n*(m-1)的矩阵,每一个位置代表前一个位置数值与原矩阵该位置数值之差。
np.nonzero(arr) # 返回非零数值的索引。结果是两个矩阵,第一个矩阵是行索引,第二个矩阵是列索引。
np.sort(arr) # 返回矩阵每行从小到大排序后的结果。注意不是所有矩阵排序。
np.transpose(arr) # 返回矩阵的转置矩阵。同arr.T。
np.clip(arr, min, max) # 将矩阵中大于max的值重置为max,将矩阵中小于min的值重置为min,处于两者之间的保留原样。
6. 索引
类似于二维列表的索引。
与众不同的地方:
(1)A[1][2]可以写作A[1, 2]
(2)A[:, 2]代表的是第二列
(3)A[list(x), list(y)] 即选中(xi, yi)形成列表
tricky:
(1)想要迭代列
for col in A.T:
print(col)
(2)想要迭代每一项
for item in A.flat:
print(item)
注:A.flatten()返回一个一维数组,A.flat返回迭代器.
7. 合并
np.vstack(arr1, arr2) # 垂直合并
np.hstack(arr1, arr2) # 水平方向合并
np.concatenate((arr1, arr2), axis=0/1) # 指定方向的合并
注:这里有一个坑,假如A是一维行向量,比如[1, 2, 3],那么A.T仍然是[1, 2, 3],因为认为现在的A是一个列表。
如果要变成一维列向量,需要A[:, np.newaxis].
8. 分割
np.split(ary, indices_or_sections, axis=0) # 把数组分成indices_or_sections份等分的数组。
np.array_split(ary, indices_or_sections, axis=0) # 允许数组不等分。具体划分方式如下:For an array of length l that should be split into n sections, it returns l % n sub-arrays of size l//n + 1 and the rest of size l//n
9. 拓展维度
np.repeat(a, repeats, axis=None) # 复制数组中的元素;其中repeats是重复的次数,len(repeats)==a.shape[axis];axis是复制元素的方向
np.tile(a, reps) # 复制整个数组进行拼接
pandas
1. 简介
(1)操作对象
Series:一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。本质上是一个NumPy的数组。没有为数据指定索引时,会自动创建一个0到N-1(N为长度)的整数型索引。基本操作参见:https://blog.csdn.net/zutsoft/article/details/51482573
Dataframe:表格型的数据结构。每列可以是不同的值类型(数值,字符串,布尔值等)。可以被看做由Series
组成的大字典。基本操作参见:https://blog.csdn.net/u014281392/article/details/75331570。
创建对象:
df1 = pd.Dataframe(arr, columns=[], index=[]) # index是指行索引。
df2 = pd.DataFrame({'col1':[],'col2':[]},index=[])
对象属性:
df.index
df.columns
df.values # 返回没有索引的Numpy数组
df.dtypes # 输出每一列的类型
操作函数:
df.describe() # 返回一些统计学数据,只会运算数字列
df.transpose() # 转置矩阵,相当于df.T
df.sort_index(axis=0/1, ascending=True/False) # 按照行/列索引进行排序
df.sort_values(by=[], axis=0, ascending=True) # 将指定行、列按照值进行排序
(2)优势
能够快速的处理电子表格格式的数据,同时具有强大的io功能,处理多种数据类型和转换
(3)兼容格式
xls
或xlsx、
文本文件、csv、
hdf
文件、xml、
html
2. 导入
import pandas as pd
3. 选择数据
(1)df.loc[] # 按照标签访问数据。所谓标签,指的是不能按照0-n-1的编号,而是按照指定的名称访问。
举例:
df = pd.DataFrame(arr, index=['row1', 'row2'], columns=['col1', 'col2', 'col3'])
print(df)
print(df.loc[:, 'col1':'col2'])
(2)df.iloc[] # 按照位置访问数据。
df = pd.DataFrame(arr, index=['row1', 'row2'], columns=['col1', 'col2', 'col3'])
print(df)
print(df.iloc[1:2, 1:2])
(3)df.ix[] # 混合前两种的索引方式。Python3已经弃用。
(4)df[]
访问列数据:
df = pd.DataFrame(arr, index=['row1', 'row2'], columns=['col1', 'col2', 'col3'])
print(df)
print(df.columns[1:3])
print(df[df.columns[1:3]])
print(df[['col2', 'col3']])
需要使用标签数组,具体参见最后一个。
访问行数据:
df = pd.DataFrame(arr, index=['row1', 'row2'], columns=['col1', 'col2', 'col3'])
print(df)
print(df[0:1])
print(df['row1':'row3'])
# print(df[0]) # 报错
# print(df['row1']) # 报错
可以使用标签或者位置的切片访问,不能使用数组。
4. 设置数据
(1)选择某个数据然后赋值
具体参见上述选择数据的方式,比如:
df.iloc[2, 2] = 111
(2)对于满足某种条件的数据进行赋值
df[df > 2] = 222
(3)对于不存在的列进行赋值,可以创造出新的列
df['E'] = np.nan
5. 处理丢失数据
处理丢失数据的方式有以下两种:
(1)丢掉具有NaN的行或者列
df.dropna(axis=0/1, how='all'/'any') # 若是how为'all',那么为相应行或者列全部都是NaN时候会丢掉该行或者该列。若是how为'any',那么为相应行或者列只要包含一个及以上的NaN,就丢弃。
(2)将丢失数据部分填充为指定的值。
df.fillna(value=0) # 将NaN的部位填充为指定的value。
(3)测试是否有丢失数据
注:使用函数np.any()检查是否存在某个值。
print(np.any(np.isnull()))
6. 导入导出数据
read_xxx() # 读取xxx格式的文件。xxx是指数据格式。
to_xxx() # 保存成xxx格式的文件。
以下为常用的函数以及注意点:
1. pd.read_scv(file_name, default_sep)
加载带分隔符的数据,默认分隔符为','
需要注意:
函数自动把第一行作为列属性,如果需要取消,那么设置header=None;
函数自动默认第一列为数据,如果需要设置为行属性,那么设置index_col=0(这个属性可以设置行属性列)。
7. 合并操作
1. 类似数据库的按行或者按列合并
merge
https://blog.csdn.net/zwhooo/article/details/79696558
8. 分组与聚合(Group分组与agg)
1. pandas group分组与agg聚合
https://blog.csdn.net/u012706792/article/details/80892510
注意groupby之后是一个对象,需要迭代输出,其中index是用作划分的属性的元组组合,newdf是分组之后形成的新的df。
groupby再agg之后不能够迭代,直接输出即可。
9. 数据可视化(与matlibplot结合)
(1) import头文件
import matlibplot.pyplot as plt
(2) 绘图基本操作
绘图的方式有许多个,每一种对应不同的图类型,比如'bar','hist','box','area'等等。
plt.show() # 注意只有show之后图片才能显示出来。
常用函数一:data.plot() 绘制曲线图
如果data是Series,那么显示出一条曲线,以index为横坐标,以value为纵坐标。如果data是DataFrame,那么每一列显示出一条曲线,每一条曲线的横坐标为index,每一条曲线的纵坐标为相应列的value。
常用函数二:data.scatter()绘制散点图
df = pd.DataFrame(arr, index=['row1', 'row2'], columns=['col1', 'col2', 'col3'])
ax = df.plot.scatter(x='col1', y='col2', color='DarkBlue', label='Class1')
df.plot.scatter(x='col1', y='col3', color='LightGreen', label='Class2', ax=ax)
plt.show()
常用函数三:plt.bar()
10. 筛选
1. 根据列的值选取多行数据
参考链接:pandas中根据列的值选取多行数据
11. 其他操作
1. 矩阵某行归一化,即某行元素同时除以该行元素的和
假设原矩阵为x,大小为m*n
y = x.sum(1) // 首先将x的每一列加起来,得到m*1的向量
z = x.div(y, axis=0) // 将x的行中的每一个元素分别处以y的行元素