Pandas&Numpy 数据处理笔记
文章目录
参考: Pandas Cheatsheet和《joyful pandas》
基础知识
Python基础
常用语法糖(2个),匿名函数,map, zip, enumerate等
列表推导式
[<映射函数> for i in <迭代对象>]
# 可以多层嵌套:
[m+'_'+n for m in ['a', 'b'] for n in ['c', 'd']]
条件赋值
也是很有用的语法糖
value = a if condition else b
类似C++的value=condition? a:b;
匿名函数与map方法
- 匿名函数
清晰简单的映射关系可以用匿名函数定义:
lambda 变量:对变量的操作
my_func = lambda x: 2*x
- map方法
第一个参数为调用的函数,之后是自变量构成的可迭代对象(定义域),返回函数值构成的list(值域)
map(function, iterable)
map(function, iterable1, iterable2...) #也可以有多个可迭代对象
- 匿名函数与map的联系
用map可以很方便地得到匿名函数在一串数上的映射结果:
list(map(lambda x:2*x, listX))
# 等价于
list((lambda x:2*x)(i) for i in listX)
封装成可迭代对象 zip(), enumerate()
- zip()
封装成可迭代的zip对象, list(zip(object))的成员是object内部元素值
L1, L2, L3 = list('abc'), list('def'), list('hij')
zipped = zip(L1, L2, L3) # 没有tuple()或list()打包前是个zip对象
# 得到[('a', 'd', 'h'), ('b', 'e', 'i'), ('c', 'f', 'j')]
- enumerate()
封装成可迭代的enumerate对象,相对zip()区别是:- enumerate()还会返回每个元素的下标
- enumerate()参数为一个可迭代对象+(可选)开始封装的下标
list(enumerate(object))的成员是object内部元素的下标和元素值构成的tuple(index, value)
L1=list('abc')
zipped = enumerate(L1) # 没有tuple()或list()打包前是个enumerate对象
# 得到[(0, 'a'), (1, 'b'), (2, 'c')]
-
不转换成list,tuple等常用数据结构时
zip()和enumerate()本身可用于for循环中作迭代的对象:- zip():
- enumerate() 用于同时需要处理迭代对象成员的下标时:
- zip():
# 将下标和值 直接输出
for index, value in enumerate(L1):
print(index, value)
Numpy基础
numpy数组(np.array)构造与操作
特殊矩阵 全0/1/某个值 单位矩阵
传参数时传入维度数构成的tuple(除非只有一维度,可以不加括号)
# 传入每个维度数组成的tuple
np.zeros((2,3)) #2*3的全0矩阵
np.ones((2,3)) #2*3的全1矩阵
np.full((2,3),10) #2*3的‘全10矩阵’ 第二个参数为全部赋成的值
np.eyes(3) #3*3的单位矩阵(必然方阵)
随机矩阵 np.random
np.random类的构造函数有rand, randn, randint, choice
,分别返回0-1 均匀分布的随机数组、标准正态分布、随机整数和随机列表抽样分布构成的np.array
np.random.rand(3) # 生成服从 0-1 均匀分布的三个随机数组成的np.array
np.random.rand(2,3) # 生成服从 0-1 均匀分布的2*3个随机数组成的np.array 注意这里不是tuple而是直接传入一个个维度数
(b-a)*np.random.rand(2,3)+a # (b,a)上的均匀分布
np.random.randn(2,3) # 标准正态分布
mu+sigma*np.random.randn(2,3) # (mu,sigma^2)的正态分布
np.random.randint(low, high, size) # low, high为这些随机整数的最小值和最大值,size为维度的tuple
np数组的操作
- 转置
array.T
- 合并操作
array.r_, array.c_
- 维度变换
reshape
- 切片
start:end:step
或tuple(索引)
- 布尔索引
np.ix_
合并操作:
注意一维数组和多维数组合并时必须视一维数组为列向量,只能用列合并.c_(左右合并)
np.c_[np.zeros(2),np.zeros((2,1))] # 正确
np.r_[np.zeros(2),np.zeros((2,1))] # 报错,提示维度不对
维度变换:
array.T不写括号(直接对array本身操作,但不是所有的函数都这样,比如array.sum())
reshape()直接传入维度,而不是传入维度tuple
切片:
切片本质就是索引,所以写在整数索引的位置上,只不过返回的一般是子矩阵等(而不是一个标量)
- 写法1:
start:end:step
左闭右开,截取时不取end那一维度 - 写法2:使用索引tuple,直接传入该维度上要截取的
tuple(index)
例如:
target=np.arange(9).reshape(3,3) # [[1,2,3],[4,5,6],[7,8,9]]
targetSlice=target[:-1, (0,1)] # 选取行:最后一行(不含)之前的行;选取列:0、1两列
输出结果为:[[0 1], [3 4]]
- 切片前:
- 切片后:
np数组相关的常用函数
- np.where
常用于给np.array(a)赋值,格式为np.where(条件,v1,v2)
,满足条件的赋为v1,否则赋为v2
(类似SQL的IF(cond,v1,v2)
)
np.where(a>0, a, 5) # 给数组a赋值 对应位置为 True 时填充 a 对应元素,否则填充 5
- array.nonzero, array.argmax, array.argmin
返回相应元素的下标
分别为非零元素下标(返回list),最大值下标,最小值下标