插入cell:a b 删除cell:x cell模式的切换:m:Markdown模式 y:code模式 运行cell:shift+enter tab:补全 shift+tab:打开帮助文档
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。html
1. 使用np.array()建立 一维数据建立 import numpy as np np.array([1,2,3,4,5],dtype=int) 二维数组建立 np.array([[1,2,3],[4,5,6],[7.7,8,9]])
注意:
numpy默认ndarray的全部元素的类型是相同的
若是传进来的列表中包含不一样的类型,则统一为同一类型,优先级:str>float>intpython
import matplotlib.pyplot as plt img_arr = plt.imread('bobo.jpg')#当前目录下的图片 plt.imshow(img_arr) img.shape #(626, 413, 3)#前面两个数字表示像素,最后一个表示颜色
包含如下常见建立方法: 1) np.ones(shape, dtype=None, order='C') np.ones(shape=(4,5),dtype=float)#默认为1 np.zeros(shape, dtype=None, order='C')#默认为0 np.full(shape, fill_value, dtype=None, order='C') np.full(shape=(6,7),fill_value=999) np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 等差数列 np.linspace(0,100,20)#返回20个数,等差是5的一维数组 np.arange([start, ]stop, [step, ]dtype=None) arr1 = np.arange(3,10,2) #3是开始,10是结束,2是步长 的一维数组 np.random.seed(10)#固定时间因子 np.random.randint(0,100,size=(3,4))#产生的随机数固定 array([[ 9, 15, 64, 28], [89, 93, 29, 8], [73, 0, 40, 36]])
注意:只有arange和linspace产生一维数组,其余的均可产生一维或者多维数组数组
4个必记参数: ndim:维度 shape:形状(各维度的长度) size:总长度 dtype:元素类型
1. 索引 一维与列表彻底一致 多维时同理 np.random.seed(1) arr = np.random.randint(0,100,size=(5,5)) #根据索引修改数据 arr[1][2] = 6666444 #获取二维数组前两行 arr[0:2] #获取二维数组前两列 arr[:,0:2] #获取二维数组前两行和前两列数据 arr[0:2,0:2] #将数组的行倒序 arr[::-1] #列倒序 arr[:,::-1] #所有倒序 arr[::-1,::-1] #将图片进行全倒置操做 plt.imshow(img_arr[::-1,::-1,::-1]) 变形 .将一维数组变造成多维数组 array([[ 37, 12, 72, 9, 75], [ 5, 79, 6666444, 16, 1], [ 76, 71, 6, 25, 50], [ 20, 18, 84, 11, 28], [ 29, 14, 50, 68, 87]]) arr.shape (5, 5)
使用arr.reshape()函数,注意参数是一个tuple!数组元素变形先后要统一!数据结构
a.reshape((5,-1)) #-1表示的是自动计算行或列 array([[ 37, 12, 72, 9, 75], [ 5, 79, 9999, 16, 1], [ 76, 71, 6, 25, 50], [ 20, 18, 84, 11, 28], [ 29, 14, 50, 68, 87]]) 将多维数组变造成一维数组 a = arr.reshape((25,)) a.shape (25,) 图片倒置 img_arr.shape (626, 413, 3) img_arr.size 775614 #将原数据三维数组变造成一维数组 arr_1 = img_arr.reshape((775614,)) #将arr_1元素倒置 arr_1 = arr_1[::-1] #将arr_1变造成三维数组 a_img = arr_1.reshape((626, 413, 3)) plt.imshow(a_img)
np.concatenate((arr,arr),axis=1) #0 纵轴 1 横轴 级联须要注意的点: 级联的参数是列表:必定要加中括号或小括号 维度必须相同 形状相符:在维度保持一致的前提下,若是进行横向(axis=1)级联,必须保证进行级联的数组行数保持一致。若是进行纵向(axis=0)级联,必须保证进行级联的数组列数保持一致。 可经过axis参数改变级联的方向 np.vstack():在竖直方向上堆叠 np.hstack():在水平方向上平铺
与级联相似,三个函数完成切分工做: np.split(arr,行/列号,轴):参数2是一个列表类型 plt.imshow(np.split(img,(400,),axis=0)[0]) np.vsplit np.hsplit
全部赋值运算不会为ndarray的任何元素建立副本。对赋值后的对象的操做也对原来的对象生效。 可以使用copy()函数建立副本 c_arr = arr.copy() c_arr[1][4] = 100100
求和np.sum arr.sum(axis=1)#求行的和 最大最小值:np.max/ np.min 平均值:np.mean() 其余聚合操做 Function Name NaN-safe Version Description np.sum np.nansum Compute sum of elements np.prod np.nanprod Compute product of elements np.mean np.nanmean Compute mean of elements np.std np.nanstd Compute standard deviation np.var np.nanvar Compute variance np.min np.nanmin Find minimum value np.max np.nanmax Find maximum value np.argmin np.nanargmin Find index of minimum value np.argmax np.nanargmax Find index of maximum value np.median np.nanmedian Compute median of elements np.percentile np.nanpercentile Compute rank-based statistics of elements np.any N/A Evaluate whether any elements are true np.all N/A Evaluate whether all elements are true np.power 幂运算
【重要】ndarray广播机制的三条规则:缺失维度的数组将维度补充为进行运算的数组的维度。缺失的数组元素使用已有元素进行补充。
规则一:为缺失的维度补1(进行运算的两个数组之间的维度只能相差一个维度)
规则二:缺失元素用已有值填充
规则三:缺失维度的数组只能有一行或者一列app
m = np.ones((2, 3)) a = np.arange(3) display(m,a) array([[1., 1., 1.], [1., 1., 1.]]) array([0, 1, 2]) m+a array([[1., 2., 3.], [1., 2., 3.]])
快速排序
np.sort()与ndarray.sort()均可以,但有区别:
np.sort()不改变输入
ndarray.sort()本地处理,不占用空间,但改变输入
Series是一种相似与一维数组的对象,由下面两个部分组成:dom
values:一组数据(ndarray类型)
index:相关的数据索引标签函数
import pandas as pd from pandas import Series,DataFrame import numpy as np 两种建立方式: (1) 由列表或numpy数组建立 默认索引为0到N-1的整数型索引 #使用列表建立Series Series(data=[1,2,3,4,5],name='bobo') #使用numpy建立Series Series(data=np.random.randint(0,10,size=(5,))) #还能够经过设置index参数指定索引 s = Series(data=np.random.randint(0,10,size=(5,)),index=['a','b','c','d','e']) 由字典建立:不能在使用index.可是依然存在默认索引 dic = { '语文':100, '数学':90 } s = Series(data=dic)
可使用中括号取单个索引(此时返回的是元素类型),或者中括号里一个列表取多个索引(此时返回的是一个Series类型)。工具
(1) 显式索引: - 使用index中的元素做为索引值 - 使用s.loc[](推荐):注意,loc中括号中放置的必定是显示索引 注意,此时是闭区间,能取到尾 (2) 隐式索引: - 使用整数做为索引值 - 使用.iloc[](推荐):iloc中的中括号中必须放置隐式索引 注意,此时是半开区间,取不到尾 切片:隐式索引切片和显示索引切片 显示索引切片:index和loc s['a':'d'] s.loc['a':'c'] 隐式索引切片:整数索引值和iloc s.iloc[0:3]
能够把Series当作一个定长的有序字典 向Series增长一行:至关于给字典增长一组键值对 s['g'] = 10 能够经过shape,size,index,values等获得series的属性 s.index s.values 可使用s.head(),tail()分别查看前n个和后n个值 s.head(3) 对Series元素进行去重 s.unique() #返回的是一个ndarray 当索引没有对应的值时,可能出现缺失数据显示NaN(not a number)的状况 使得两个Series进行相加 In [41]: s1 = Series([1,2,3],index=['a','b','c']) s2 = Series([1,2,3],index=['a','b','d']) s = s1+s2 a 2.0 b 4.0 c NaN d NaN dtype: float64 可使用pd.isnull(),pd.notnull(),或s.isnull(),notnull()函数检测缺失数据 s.isnull() a False b False c True d True dtype: bool s.notnull() a True b True c False d False dtype: bool s[s.notnull()]#过滤掉空的数据 a 2.0 b 4.0 dtype: float64
(1) + - * /
(2) add() sub() mul() div()
(3) Series之间的运算 在运算中自动对齐不一样索引的数据 若是索引不对应,则补NaN s1 = Series([1,2,31,2],index=["a","d","s","r"]) s2 = Series([11,2,2,3],index=["a","d","s","b"]) s = s1+s2 a 12.0 b NaN d 4.0 r NaN s 33.0 dtype: float64
s1.add(s2,fill_value=1)
a 2.0 b 4.0 c 4.0 d 4.0 dtype: float64
DataFrame是一个【表格型】的数据结构。DataFrame由按必定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。lua
最经常使用的方法是传递一个字典来建立。DataFrame以字典的键做为每一【列】的名称,以字典的值(一个数组)做为每一列。spa
此外,DataFrame会自动加上每一行的索引。
使用字典建立的DataFrame后,则columns参数将不可被使用。
同Series同样,若传入的列与字典的键不匹配,则相应的值为NaN。
DataFrame(data=np.random.randint(0,100,size=(3,4)),index=['a','b','c'])
dic={ "name":["john","tom"], "salay":[100,222] } df = DataFrame(data=dic,index=["a","b"]) df
(1) 对列进行索引
- 经过相似字典的方式 df['q'] - 经过属性的方式 df.q
能够将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name属性也已经设置好了,就是相应的列名。
#修改列索引
#获取前两列
- 使用.loc[]加index来进行行索引 - 使用.iloc[]加整数来进行行索引
一样返回一个Series,index为原来的columns。
- 使用列索引 - 使用行索引(iloc[3,1] or loc['C','q']) 行索引在前,列索引在后
【注意】 直接用中括号时:
在loc和iloc中使用切片(切列)
(1) DataFrame之间的运算
同Series同样:
有两种丢失数据:
1. None
None是Python自带的,其类型为python object。所以,None不能参与到任何计算中。
np.nan(NaN)
np.nan是浮点类型,能参与到计算中。但计算的结果老是NaN。
1) pandas中None与np.nan都视做np.nan
2) pandas处理空值操做
isnull()
notnull()
dropna()
: 过滤丢失数据fillna()
: 填充丢失数据(1)判断函数
isnull()
notnull()
df.notnull/isnull().any()/all()
只有函数名含有drop的函数的axis中0表示行,1表示的列
(3) 填充函数 Series/DataFrame
fillna()
:value和method参数最多见的方法是给DataFrame构造函数的index或者columns参数传递两个或更多的数组
使用product: 最简单,推荐使用
DataFrame的操做
# 总结: #直接使用[],索引是列索引,切片是行切片 # 访问一列或多列 直接用中括号[columnname] [[columname1,columnname2...]] #访问一行或多行 .loc[inexname]/.loc[[indexname1,indexname2]] # 访问某一个元素 .loc[indexname,columnname] # 行切片 .loc[index1:index2] # 列切片 .loc[:,column1:column2]
所谓的聚合操做:平均数,方差,最大值,最小值……
pandas的拼接分为两种:
pandas使用pd.concat函数,与np.concatenate函数相似,只是多了一些参数:
objs axis=0 #横向仍是纵向级联 keys #标识,跟级联的表的个数一致 join='outer' / 'inner':表示的是级联的方式,outer会将全部的项进行级联(忽略匹配和不匹配),而inner只会将匹配的项级联到一块儿,不匹配的不级联 ignore_index=False #忽略行索引
不匹配指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时行索引不一致
有2种链接方式:
因为在后面级联的使用很是广泛,所以有一个函数append专门用于在后面纵向添加
merge与concat的区别在于,merge须要依据某一共同的列来进行合并
使用pd.merge()合并时,会自动根据二者相同column名称的那一列,做为key来进行合并。
注意每一列元素的顺序不要求一致
参数:
使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每一个元素对应一行,若是该行不是第一次出现,则元素为True
- keep参数:指定保留哪一重复的行数据,first:第一行 last:最后一行 False所有删
drop_duplicates(keep='first/last'/False)
replace()函数:替换元素
使用replace()函数,对values进行映射操做
replace参数说明:
单值普通替换
多值列表替换
单值字典替换
多值字典替换
按列指定单值替换
字典替换
新建一列 , map函数并非df的方法,而是series的方法
map()中可使用方法,能够是自定义的方法
eg:map({to_replace:value})
注意:并非任何形式的函数均可以做为map的参数。只有当一个函数具备一个参数且有返回值,那么该函数才能够做为map的参数。
使用lambda表达式
使用df.std()函数能够求得DataFrame对象每一列的标准差
第一种方法
第二种方法
- take()函数接受一个索引列表,用数字表示,使得df根据列表中索引的顺序进行排序 - eg:df.take([1,3,4,2,5])
能够借助np.random.permutation()函数随机排序
数据聚合是数据处理的最后一步,一般是要使每个数组生成一个单一的数值。
数据分类处理:
数据分类处理的核心:
- groupby()函数 - groups属性查看分组状况 - eg: df.groupby(by='item').groups