python-numpy&pandas学习

Numpy学习

一、数组基本属性

  • ndim:维度
  • shape:行数和列数
  • size:元素个数

二、numpy创建数组

a = np.array([2,23,4])  # list 1d
  • array:创建数组
  • dtype:指定数据类型
  • 使用list来创建
  • zeros:创建数据全为0
  • ones:创建数据全为1
  • empty:创建数据接近0
  • arrange:按指定范围创建数据
  • linspace:创建线段
  • reshape:改变数组形状

三、广播

  1. 如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制。
  2. 广播规则
    • 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐
    • 输出数组的形状是输入数组形状的各个维度上的最大值
    • 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
    • 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。

四、数组操作

  • 修改数组形状
函数 描述
reshape 不改变数据的条件下修改形状
flat 数组元素迭代器
flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组。(order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'K' -- 元素在内存中的出现顺序)
ravel 返回展开数组,修改会影响原始数组。(order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'K' -- 元素在内存中的出现顺序)
  • 翻转数组
函数 描述
transpose 对换数组的维度
ndarray.T 和self.transpose()相同,数组的转置
rollaxis 向后滚动指定的轴
swapaxes 对换数组的两个轴
  • 修改数组的维度
函数 描述
broadcast 产生模仿广播的对象
broadcast_to 将数组广播到新形状
expand_dims 扩展数组的形状
squeeze 从数组的形状中删除一维条目
  • 连接函数
函数 描述
concatenate 连接沿现有轴的数组序列
stack 沿着新的轴加入一系列数组
hstack 水平堆叠序列中的数组(列方向)
vstack 竖直堆叠序列中的数组(行方向)
  • 分割数组
函数 描述
split 将一个数组分割为多个子数组
hsplit 将一个数组水平分割为多个子数组(按列)
vsplit 将一个数组垂直分割为多个子数组(按行)
  • 数组元素的添加与删除
函数 描述
resize 返回指定形状的新数组
append 将值添加到数组末尾
insert 沿指定轴将值插入到指定下标之前
delete 删掉某个轴的子数组,并返回删除后的新数组
unique 查找数组内的唯一元素

五、位运算

函数 描述
bitwise_and 对数组元素执行位与操作
bitwise_or 对数组元素执行位或操作
invert 按位取反
left_shift 向左移动二进制表示的位
right_shift 向右移动二进制表示的位

六、字符串函数

  • 下面这些函数都在字符数组类(numpy.char)中定义
函数 描述
add() 对两个数组的逐个字符串元素进行连接
multiply() 返回按元素多重连接后的字符串
center() 居中字符串
capitalize() 将字符串第一个字母转换为大写
title() 将字符串的每个单词的第一个字母转换为大写
lower() 数组元素转换为小写
upper() 数组元素转换为大写
split() 指定分隔符对字符串进行分割,并返回数组列表
splitlines() 返回元素中的行列表,以换行符分割
strip() 移除元素开头或者结尾处的特定字符
join() 通过指定分隔符来连接数组中的元素
replace() 使用新字符串替换字符串中的所有子字符串
decode() 数组元素依次调用str.decode
encode() 数组元素依次调用str.encode

七、数学函数

  • 三角函数:sin()、cos()、tan()、arcsin()、arccos()和 arctan()。
  • 舍入函数:numpy.around() 函数返回指定数字的四舍五入值;numpy.floor() 返回数字的下舍整数;numpy.ceil() 返回数字的上入整数。

八、算术运算

  • 算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide()。
  • numpy.reciprocal() :函数返回参数逐元素的倒数。
  • numpy.power():函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。
  • numpy.mod() 计算输入数组中相应元素的相除后的余数。 函数 numpy.remainder() 也产生相同的结果。

九、统计函数

函数 描述
numpy.amin() 用于计算数组中的元素沿指定轴的最小值, 如果提供了轴,则沿其计算。
numpy.amax() 用于计算数组中的元素沿指定轴的最大值, 如果提供了轴,则沿其计算。
numpy.ptp() 数计算数组中元素最大值与最小值的差(最大值 - 最小值), 如果提供了轴,则沿其计算。
numpy.percentile() 百分位数是统计中使用的度量,表示小于这个值的观察值的百分比, 如果提供了轴,则沿其计算。
numpy.median() 函数用于计算数组 a 中元素的中位数(中值), 如果提供了轴,则沿其计算。
numpy.mean() 函数返回数组中元素的算术平均值, 如果提供了轴,则沿其计算。
numpy.average() 函数根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值。该函数可以接受一个轴参数。 如果没有指定轴,则数组会被展开
  • 标准差:标准差是一组数据平均值分散程度的一种度量。
    标准差是方差的算术平方根。sqrt(mean((x - x.mean())**2))

  • 方差:统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,即 mean((x - x.mean())** 2)

  • 百分位数:

    • 第 p 个百分位数是这样一个值,它使得至少有 p% 的数据项小于或等于这个值,且至少有 (100-p)% 的数据项大于或等于这个值。
      举个例子:高等院校的入学考试成绩经常以百分位数的形式报告。比如,假设某个考生在入学考试中的语文部分的原始分数为 54 分。相对于参加同一考试的其他学生来说,他的成绩如何并不容易知道。但是如果原始分数54分恰好对应的是第70百分位数,我们就能知道大约70%的学生的考分比他低,而约30%的学生考分比他高。这里的 p = 70。

十、排序、条件刷选函数

函数 描述
numpy.sort() 函数返回输入数组的排序副本
numpy.argsort() 函数返回的是数组值从小到大的索引值
numpy.lexsort() 用于对多个序列进行排序。把它想象成对电子表格进行排序,每一列代表一个序列,排序时优先照顾靠后的列
msort(a) 数组按第一个轴排序,返回排序后的数组副本。np.msort(a) 相等于 np.sort(a, axis=0)
sort_complex(a) 对复数按照先实部后虚部的顺序进行排序
partition(a, kth[, axis, kind, order]) 指定一个数,对数组进行分区
argpartition(a, kth[, axis, kind, order]) 可以通过关键字 kind 指定算法沿着指定轴对数组进行分区
numpy.argmax() 函数分别沿给定轴返回最大元素的索引
numpy.argmin() 函数分别沿给定轴返回最小元素的索引
numpy.nonzero() 函数返回输入数组中非零元素的索引
numpy.where() 函数返回输入数组中满足给定条件的元素的索引
numpy.extract() 函数根据某个条件从数组中抽取元素,返回满条件的元素

十一、副本与视图

  • 副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。
    • 副本一般发生在:
      1、Python 序列的切片操作,调用deepCopy()函数。
      2、调用 ndarray 的 copy() 函数产生一个副本。
  • 视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。
    • 视图一般发生在:
      1、numpy 的切片操作返回原数据的视图。
      2、调用 ndarray 的 view() 函数产生一个视图。

十二、矩阵库(Matrix)

  • NumPy 中包含了一个矩阵库 numpy.matlib,该模块中的函数返回的是一个矩阵,而不是 ndarray 对象。
    |创建矩阵的方法|描述|
    |----|----|
    |matlib.empty()|函数返回一个新的矩阵|
    |numpy.matlib.zeros()|函数创建一个以 0 填充的矩阵|
    |numpy.matlib.ones()|函数创建一个以 1 填充的矩阵|
    |numpy.matlib.eye()|函数返回一个矩阵,对角线元素为 1,其他位置为零|
    |numpy.matlib.identity()|函数返回给定大小的单位矩阵|
    |numpy.matlib.rand()|函数创建一个给定大小的矩阵,数据是随机填充的|

十三、线性代数

  • NumPy 提供了线性代数函数库 linalg,该库包含了线性代数所需的所有功能
函数 说明
dot 两个数组的点积,即元素对应相乘
vdot 两个向量的点积
inner 两个数组的内积
matmul 两个数组的矩阵积
determinant 数组的行列式
solve 求解线性矩阵方程
inv 计算矩阵的乘法逆矩阵

十四、数据保存和读取

  • Numpy 可以读写磁盘上的文本数据或二进制数据。
  • NumPy 为 ndarray 对象引入了一个简单的文件格式:npy。
  • npy 文件用于存储重建 ndarray 所需的数据、图形、dtype 和其他信息。
  • 常用的 IO 函数有:
    • load() 和 save() 函数是读写文件数组数据的两个主要函数,默认情况下, 数组是以未压缩的原始二进制格式保存在扩展名为 .npy 的文件中。
    • savze() 函数用于将多个数组写入文件,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中。
    • loadtxt() 和 savetxt() 函数处理正常的文本文件(.txt 等)。
函数 描述
numpy.save() 函数将数组保存到以 .npy 为扩展名的文件中,使用numpy.load()来获取数据
numpy.savez() 函数将多个数组保存到以 npz 为扩展名的文件中,使用numpy.load()来获取数据
savetxt() 函数是以简单的文本文件格式存储数据,对应的使用 loadtxt() 函数来获取数据

Pandas学习

一、基本介绍

  • 如果用 python 的列表和字典来作比较, 那么可以说 Numpy 是列表形式的,没有数值标签,而 Pandas 就是字典形式。Pandas是基于Numpy构建的,让Numpy为中心的应用变得更加简单。
  • Series数据结构:索引在左边,值在右边。如果我们没有为数据指定索引。于是会自动创建一个0到N-1(N为长度)的整数型索引。
  • DataFrame数据结构:是一个表格型的数据结构,它包含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔值等)。DataFrame既有行索引也有列索引, 它可以被看做由Series组成的大字典。
#创建Srries数据结构
import pandas as pd
import numpy as np
s = pd.Series([1,3,6,np.nan,44,1])
#创建DataFrame数据结构
#方法一
dates = pd.date_range('20160101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
#方法二
df1 = pd.DataFrame(np.arange(12).reshape((3,4)))
#方法三:
df2 = pd.DataFrame({'A' : 1.,
                    'B' : pd.Timestamp('20130102'),
                    'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
                    'D' : np.array([3] * 4,dtype='int32'),
                    'E' : pd.Categorical(["test","train","test","train"]),
                    'F' : 'foo'})
#DataFrame数据结构的简单运用
print(df2.dtypes) #查看数据中的类型
print(df2.index) #查看对列的序号
print(df2.columns) #查看对列的列名
print(df2.values) #只查看所有df2的值
df2.describe() #查看数据的总结
print(df2.T) #翻转数据, transpose
print(df2.sort_index(axis=1, ascending=False)) #对数据的 index 进行排序并输出
print(df2.sort_values(by='B')) #对数据值排序输出

二、选择数据

  • 选择列或行
  • 根据标签 loc选择,即根据行的名字和烈的名字进行选择
  • 根据序列 iloc选择,即行所在的行数和列所在的列数进行选择
  • 根据ix选择,即loc和iloc混合进行选择
  • 通过判断的筛选
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
print(df['A']) #按列选择
print(df.A) #按列选择
print(df[0:3]) #切片选择
print(df['20130102':'20130104']) #切片选择
print(df.loc['20130102']) #使用标签来选择数据 ,即选择某一行
print(df.loc[:,['A','B']]) #使用切片
print(df.iloc[3,1]) #采用位置进行选择
print(df.iloc[3:5,1:3]) #使用切片
print(df.ix[:3,['A','C']]) #混合选择
print(df[df.A>8]) #采用判断指令 (Boolean indexing) 进行选择

三、设置值

  • 根据位置设置 loc 和 iloc设置值
  • 根据条件设置
  • 按行或列设置
  • 添加数据
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
df.iloc[2,2] = 1111
df.loc['20130101','B'] = 2222
df.B[df.A>4] = 0
df['F'] = np.nan
df['E'] = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130101',periods=6))

四、处理丢失数据

函数 描述
dropna() 直接去掉有 NaN 的行或列
fillna() 将 NaN 的值用其他值代替
isnull() 判断是否有缺失数据 NaN, 为 True 表示缺失数据
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan
df.dropna(
    axis=0,     # 0: 对行进行操作; 1: 对列进行操作
    how='any'   # 'any': 只要存在 NaN 就 drop 掉; 'all': 必须全部是 NaN 才 drop 
    )
df.fillna(value=0)
print(df.isnull())
print(np.any(df.isnull())) == True #表格是否包含NaN值

五、导入和导出

  • pandas可以读取与存取的资料格式有很多种,像csv、excel、json、html与pickle等…,详细请看官网说明

六、合并处理

(1)concat合并

  • pandas处理多组数据的时候往往会要用到数据的合并处理,使用 concat是一种基本的合并方式.而且concat中有很多参数可以调整,合并成你想要的数据形式.
  • 参数介绍
    • axis:合并方向,默认值为0
    • ignore_index:重置index
    • join:合并方式,默认值为outer,此方式是依照column来做纵向合并,有相同的column上下合并在一起,其他独自的column个自成列,原本没有值的位置皆以NaN填充,如果设置为inner,只有相同的column合并在一起,其他的会被抛弃。
    • join_axes:依照 axes 合并。
    • append:添加数据。

(2)merge合并

  • pandas中的merge和concat类似,但主要是用于两组有key column的数据,统一索引的数据. 通常也被用在Database的处理当中。
  • merge参数
    • 合并时有4种方法how = ['left', 'right', 'outer', 'inner'],默认值how='inner'
    • indicator=true:会将合并的记录放在新的一列。
    • 依据index合并:left_index、left_index
    • 使用suffixes解决名子重复(overlapping)的问题
import pandas as pd
#一组key的情况
#定义资料集并打印出
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                             'A': ['A0', 'A1', 'A2', 'A3'],
                             'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                              'C': ['C0', 'C1', 'C2', 'C3'],
                              'D': ['D0', 'D1', 'D2', 'D3']})
res = pd.merge(left, right, on='key')
import pandas as pd
#两组key的情况
#定义资料集并打印出
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                      'key2': ['K0', 'K1', 'K0', 'K1'],
                      'A': ['A0', 'A1', 'A2', 'A3'],
                      'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                       'key2': ['K0', 'K0', 'K0', 'K0'],
                       'C': ['C0', 'C1', 'C2', 'C3'],
                       'D': ['D0', 'D1', 'D2', 'D3']})
res = pd.merge(left, right, on=['key1', 'key2'], how='inner')
res = pd.merge(left, right, on=['key1', 'key2'], how='outer')
res = pd.merge(left, right, on=['key1', 'key2'], how='left')
res = pd.merge(left, right, on=['key1', 'key2'], how='right')
#定义资料集
boys = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [1, 2, 3]})
girls = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'age': [4, 5, 6]})
#使用suffixes解决overlapping的问题
res = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='inner')

七、plot绘图

  • 绘图方法
    • plot.bar
    • plot.hist
    • plot.box
    • plot.kde
    • plot.area
    • plot.scatter
    • plot.hexbin
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #仅仅是用来 show 图片的
# 随机生成1000个数据
data = pd.Series(np.random.randn(1000),index=np.arange(1000)) 
# 为了方便观看效果, 我们累加这个数据
data.cumsum()
# pandas 数据可以直接观看其可视化形式
data.plot()
plt.show()
data = pd.DataFrame(
    np.random.randn(1000,4),
    index=np.arange(1000),
    columns=list("ABCD")
    )
data.cumsum()
data.plot()
plt.show()
ax = data.plot.scatter(x='A',y='B',color='DarkBlue',label='Class1')
# 将之下这个 data 画在上一个 ax 上面
data.plot.scatter(x='A',y='C',color='LightGreen',label='Class2',ax=ax)
plt.show()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容