科学计算库——Pandas随笔【附网络隐私闲谈】
文章目录
- 8.2、pandas
- 8.2.1、为什么用 pandas ?
- 8.2.2、pandas Series 类型
- 8.2.3、pandas 自定义索引
- 8.2.4、pandas 如何判断数据缺失?
- 8.2.5、pandas DataFrame 类型
- 8.2.6、pandas 筛选
- 8.2.7、pandas 重新索引
- 8.2.8、pandas 算数运算和数据对齐
- 8.2.9、pandas 排序
- 8.2.10、pandas 层次索引
- 8.2.11、 pandas 文本格式数据处理
- 8.2.12、pandas 画图
- 一、引言
- 二、网络安全与隐私保护的挑战
- 三、保护网络隐私的方法与策略
- 四、结论
8.2、pandas
8.2.1、为什么用 pandas ?
pandas 是基于 numpy 数组构建的,
但二者最大的不同是 pandas 是专门为处理表格和混杂数据设计的,比较契合统计分析中的表结构,而 numpy 更适合处理统一的数值数组数据。pandas数组结构有一维 Series 和二维 DataFrame 。
8.2.2、pandas Series 类型
可以将 Series 类型看作一维数组,
字典类型转为 Series 类型/pandas 一维数组,更适合科学计算
from pandas import Series,DataFrame res = Series([1,2,3])
print(res)
Out:
0 1 1 2 2 3 dtype: int64
怎么得到和 numpy.array 类似的矩阵?
print(res.values)
Out:
[1 2 3]
8.2.3、pandas 自定义索引
怎么用?
举个例子,定义从1开始的索引,
obj = Series(['a','b','c','d','e'],index = [1,2,3,4,5]) print(obj.index)
Out:
Int64Index([1, 2, 3, 4, 5], dtype='int64')
怎么取值?
通过索引取值,沿用上面例子
obj[1]
Out:
a
结论:
Series()
可传入的参数与返回对象索引的关系:
Series()
传入列表,得到的对象,有默认索引,可自定义;
Series()
传入字典【key:value】,得到的对象,key为索引。
怎么选取特定的键值对,并返回 obj【Series对象】?
举个例子,数据来源:data【字典类型】:
data = {"a":1,"b":2,"c":3} keys = ["a","c"]
obj = Series(data, index = keys)
Out:
a 1 c 3 dtype: int64
8.2.4、pandas 如何判断数据缺失?
以 obj 对象为例,判断是否有缺失值:
pd.notnull(obj)
pd.isnull(obj)
8.2.5、pandas DataFrame 类型
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不用的类型,数值、字符串、布尔值都可以
DataFrame 本身也有行索引,列索引,字典转 DataFrame 再转置表格才一致。
举个行索引例子
data = {"60年代":[1,2,3], "70年代":[4,5,6], "80年代":[7,8,9], } res = DataFrame(data) res = res.T#转置
1)只查找60年代这组,全部列
res['60年代':'60年代']
Out:
0 1 2 60年代 1 2 3
2)查找60-70年代,全部列
res["60年代":"70年代"]
Out:
0 1 2 60年代 1 2 3 70年代 4 5 6
举个列索引的例子
1)查找全部年份,第一列,第二列
print(res.loc[:,[0,1]])#使用 loc函数
行列同时筛选,也使用 loc 函数。
为什么 DataFrame 可以理解成 Series 组成的字典 ?
DataFrame 的数据源可以是字典,Series,也可以是 DataFrame,还可以是 numpy 数组。
8.2.6、pandas 筛选
以 res 对象为例,
data = {"60年代":[1,2,3],"70年代":[4,5,6],"80年代":[7,8,9],
}
df = DataFrame(data)
1)行、列筛选
见 8.2.5
2)头部筛选
例如,取前两行
df.head(2)
3)尾部筛选
例如,取后两行
df.tail(3)
8.2.7、pandas 重新索引
reindex 函数,就是重新定义索引。
举个例子:
obj = Series([1,2,3],index=['a','b','c']) print(obj)
Out:
a 1 b 2 c 3 dtype: int64
重新定义索引:
obj_1 = obj.reindex(['a','b','c','d','e']) print(obj_1)
Out:
a 1.0 b 2.0 c 3.0 d NaN e NaN dtype: float64
重新定义索引时,如何填充缺失值/NaN?
仍以 obj 为例,
1)缺失值填充为0。
obj_2 = obj.reindex(['a','b','c','d','e'],fill_value=0) print(obj_2)
Out:
a 1 b 2 c 3 d 0 e 0 dtype: int64
2)向前填充
缺失值与它前一个位置数值保持一致,向前看齐。
obj = Series([1,2,3],index=[0,2,4]) obj = reindex(range(6),method='ffill')
Before:
0 1 2 2 4 3 dtype: int64
Out:
0 1 1 1 2 2 3 2 4 3 5 3 dtype: int64
3)向后填充
向后看齐。
obj = Series([1,2,3],index=[0,2,4]) obj = reindex(range(6),method='bfill')
Before:
0 1 2 2 4 3 dtype: int64
Out:
0 1.0 1 2.0 2 2.0 3 3.0 4 3.0 5 NaN dtype: float64
是否可以反复重新定义索引?
不可以。
若在 obj_1 基础上重新索引,没有效果,举例过程中发现,无论多少次重新定义索引,结果都与第一次重新索引结果一致。
obj_2 = obj_1.reindex(['a','b','c','d','e'],fill_value=0) print(obj_2)
Out:
a 1.0 b 2.0 c 3.0 d NaN e NaN dtype: float64
8.2.8、pandas 算数运算和数据对齐
加法(add),举个例子
1)Series 相加
obj_a = Series([1,2,3],index=[0,1,2]) obj_b = Series([1,2,3,4],index=[0,1,2,3]) obj_a + obj_b
Out:
0 2.0 1 4.0 2 6.0 3 NaN dtype: float64
2)DataFrame 相加
df1 = DataFrame(np.arange(12).reshape(4,3),index=[0,1,2,3],columns=['b','c','d']) df2 = DataFrame(np.arange(12).reshape(3,4),index=[0,1,2],columns=['a','b','c','d']) df1 + df2
Out:
a b c d 0 NaN 1.0 3.0 5.0 1 NaN 8.0 10.0 12.0 2 NaN 15.0 17.0 19.0 3 NaN NaN NaN NaN
结论:对象加法,没有对应项的结果为 NaN。
加法补充:
填补0,只要有一个对象有这一项,另一项 NaN 值做补0处理。
df1.add(df2,fill_value = 0)
Out:
a b c d 0 0.0 1.0 3.0 5.0 1 4.0 8.0 10.0 12.0 2 8.0 15.0 17.0 19.0 3 NaN 9.0 10.0 11.0
结果中的 NaN 指的是两对象中均不存在的项。
减法(sub)、乘法(mul)、除法(div)
8.2.9、pandas 排序
举几个例子:
1)Series 排序
data = Series([0,2,1],index=list('cba'))
原本序列:
c 0 b 2 a 1 dtype: int64
按照索引排序**【字典序】**:
print(data.sort_index())#有返回,返回有序
Out:
a 1 b 2 c 0 dtype: int64
按照 value 排序:
print(data.sort_values())#有返回,返回有序
Out:
c 0 a 1 b 2 dtype: int64
2)DataFrame 排序
同理,但
DataFrame 相比 Series 排序不再是一维,按索引排序是需要说明是行排序【默认,axis=0】,还是列排序【axis=1】
按照索引排序:
df = DataFrame(np.arange(6).reshape(2,3),index=['two','one'],columns=['first','third','second'])
print(df.sort_index()) print(df.sort_index(axis=1))
Out:
first third second two 0 1 2 one 3 4 5first third second one 3 4 5 two 0 1 2first second third two 0 2 1 one 3 5 4
按照 value 排序:
df = DataFrame(np.array([9,6,5,7,3,2]).reshape(2,3),index=['two','one'],columns=['first','third','second'])
Out:
first third second two 9 6 5 one 7 3 2
这里希望按照 first这一列对整个表格排序,
print(df.sort_values(by ='first'))
Out:
first third second one 7 3 2 two 9 6 5
上面给的是按照列排序,怎么按照行 value 排序?
①字典转为DF类型后,键/key 也默认成为了列索引,与排序不谋而合,
②目前学到的只有列转置,可以用学过的转置,再排序。
8.2.10、pandas 层次索引
在一个轴上拥有多个索引级别,低维度形式处理高维度数据。
层次索引/多级索引具体有什么用?
将不常接触的三维和四维数据,Pandas 也提供了 Panel 和 panel4D 对象储存。 在实践中,更直观的形式是通过层级索引(hierarchical indexing,也被称为多级索引,multi-indexing)配合多个有不同等级的一级索引一起使用,这样就可以将高维数组转换成类似一维 Series 和二维 DataFrame 对象的形式。①实现将超越二维的数据仅用两个轴来筛选它们的索引。(轴的理解在下面有提到,我的大致理解:以前的认知只停留在一维二维三维,三维压缩成二维太抽象,引入轴的解释,三维重新分配在了两个轴上,传统理解的二维特点是【一维一轴】,现在一轴要分配多维,于是出现了一轴多层的概念,多层索引的名字由此而来,我是这么理解的)
②有了更方便的数据筛选方法
举个例子,查询 pop 中2010年数据:
import numpy as np import pandas as pdindex = [('California', 2000), ('California', 2010),('New York', 2000), ('New York', 2010),('Texas', 2000), ('Texas', 2010)] populations = [33871648, 37253956,18976457, 19378102,20851820, 25145561] pop = pd.Series(populations, index=index)
传统方法
#pop进行切片查询 pop[('California', 2010): ('Texas', 2000)]#查询pop中2010年数据,比较复杂的清理办法 pop[[i for i in pop.index if i[1] == 2010]]
pandas 多级索引
#使用元组创建一个多级索引 index = pd.MultiIndex.from_tuples(index)#将前面创建的pop的索引重置(reindex)为MultiIndex,就会看到层级索引,结果是单索引的数组 #其中,前两列表示Series的多级索引值,第三列是数据。第一列中的每个空格与上面的索引相同,这是多级索引的表现形式。 pop = pop.reindex(index)#查询pop中2010年数据 pop[:,2010]
怎么理解低维度形式处理高维度数据?
通过几个维度定义成一个“新维度”,实现减少维度数量。
举个 Serie 层次索引例子:
data = Series(np.random.rand(10),index=[['A','B','C','D','E','F','G','H','I','J'],['a','b','c','a','a','b','c','d','d','e']]) print(data)
Out:
A a 0.149330 B b 0.629922 C c 0.260399 D a 0.252584 E a 0.486334 F b 0.822967 G c 0.056135 H d 0.511725 I d 0.089320 J e 0.264031 dtype: float64
我的理解:
data.index
MultiIndex([('A', 'a'),('B', 'b'),('C', 'c'),('D', 'a'),('E', 'a'),('F', 'b'),('G', 'c'),('H', 'd'),('I', 'd'),('J', 'e')],)
筛选
data = Series(np.random.rand(10),index=[['A','A','A','B','C','C','G','H','I','J'],['a','b','c','a','a','b','c','d','d','e']])
1)筛选从A到C:
print(data['A':'C'])
Out:
A a 0.023985 b 0.555995 c 0.422598 B a 0.715328 C a 0.931982 b 0.949591 dtype: float64
2)既然多层,筛选具体到第二层,筛选第二层索引为a的数据,第一层不做要求
这里和视频中有出入,视频中 data.index 得到的返回值和我的也不一致,并没有出现 levels、codes 这些关键字,使用数字筛选第二层报错。
print(data[:,'a'])
Out:
A 0.694404 B 0.162430 C 0.260433 dtype: float64
能保证层次索引的唯一性吗?
data = Series(np.random.rand(10),index=[['A','A','C','D','E','F','G','H','I','J'],['a','a','c','a','a','b','c','d','d','e']])
Out:
A a 0.849224 #一对多? a 0.359825 #一对多? C c 0.116364 D a 0.316153 E a 0.847800 F b 0.029664 G c 0.476278 H d 0.561757 I d 0.407979 J e 0.830286 dtype: float64
貌似是不能的。
举个 DF 层次索引的例子进一步理解:
data = DataFrame(np.random.rand(12).reshape(4,3),index=[['A','A','B','B'],['a','b','a','b']],columns=[['col-1','col-2','col-3'],['ccl-11','col-22','col-33']]) print(data)
Out:
col-1 col-2 col-3ccl-11 col-22 col-33 A a 0.833527 0.577264 0.802922 b 0.804280 0.629228 0.761563 B a 0.997186 0.556085 0.387777 b 0.231312 0.375912 0.749231
我目前的理解:
用 x、y 轴去解释,
x轴:每层索引数量为4, 层数不限
y轴:每层索引数量为3,层数不限
若 x、y 轴层数都限制为1,退化为一般的 DataFrame / 表格 / 二维数组。
给层次索引的这个层,定义名字:
data.index.names=['行-第1层','行-第2层'] data.columns.names=['列-第1层','列-第2层']
Out:
列-第1层
科学计算库——Pandas随笔【附网络隐私闲谈】相关推荐
- 科学计算库Pandas的使用(附思维导图)
pandas Pandas介绍 2008年WesMcKinney开发出的库: 专门用于数据挖掘的开源python库: 以Numpy为基础,借力Numpy模块在计算方面性能高的优势: 基于matplot ...
- 004.python科学计算库pandas(中)
测试数据 titanic_train.csv isnull import pandastitanic_survival = pandas.read_csv("titanic_train.cs ...
- Python科学计算库 — Pandas数学统计方法
首先导入pandas库 import numpy as np import pandas as pd Pandas 常用的数学统计方法如下表: 方法 说明 count 计算非NA值的数量 descri ...
- 【A-003】python数据分析与机器学习实战 Python科学计算库 Pandas数据分析处理库(二)
目录: 处理缺失数据制作透视图删除含空数据的行和列多行索引使用apply函数 本节要处理的数据来自于泰坦尼克号的生存者名单,它的数据如下: PassengerId Survived Pclass .. ...
- 005.python科学计算库pandas(下)
测试数据 fandango_score_comparison.csv series import pandas as pd from pandas import Seriesfandango = pd ...
- pandas删除数据库 python_Python常见的科学计算库
科学计算包Pandas Pandas 是 Python 的核心数据分析支持库,提供了快速.灵活.明确的数据结构,旨在简单.直观地处理关系型.标记型数据. Pandas 的目标是成为 Python 数据 ...
- 机器学习——科学计算库(Numpy,Matplotlib,Pandas)
机器学习--科学计算库中主要介绍的内容是人工智能深度学习过程常用的几个python库,主要有Numpy,Matplotlib,Pandas等,具体如下所示 在学习的过程中,我也从网上借鉴了多位大佬的优 ...
- Python_机器学习_常用科学计算库_第6章_ Seaborn+综合案例
Python_机器学习_常用科学计算库_第6章_ Seaborn+综合案例 文章目录 Python_机器学习_常用科学计算库_第6章_ Seaborn+综合案例 Seaborn 学习目标 6.1 Se ...
- 【Python基础】科学计算库Scipy简易入门
0.导语 Scipy是一个用于数学.科学.工程领域的常用软件包,可以处理插值.积分.优化.图像处理.常微分方程数值解的求解.信号处理等问题.它用于有效计算Numpy矩阵,使Numpy和Scipy协同工 ...
最新文章
- 剑指offer_第13题_调整数组顺序使奇数位于偶数前面
- 为数字资产交易设计安全的钱包架构
- 科学家王海峰:从百度十篇论文入选ACL 2019说起
- 【Groovy】Groovy 方法调用 ( 字符串切割 | 使用 Java 语法切割字符串 | 使用 Groovy 语法切割字符串直接为变量赋值 | 数组赋值给变量 变量个数小于等于数组长度 )
- C语言的本质(35)——共享库
- 子网划分详解与子网划分实例
- poj2441状态压缩dp基础
- Maven依赖配置和依赖范围
- 【转】JavaScript中的匿名函数及函数的闭包
- java8 comparator接口_Java8 Comparator 排序方法
- 微信小程序上传图片,视频及预览
- 算法:翻转图片Rotate Image
- 用直接分解法求方程组的C语言程序,LU分解法解线性方程组(C语言)
- 在线人民币大写转换器工具-把数字金额转换成中文大写
- 魔方还原算法学习笔记
- Deep learning for minimum mean-square error approaches to speech enhancement
- PHP:preg_match
- stm32f302实现斩波控制步进电机_电子产品装调与智能检测实训考核装置
- 《Journal of Building Engineering》期刊介绍(SCI 3区)
- 键盘事件keydown、keypress、keyup随笔整理总结
热门文章
- 一个简单的双骰子游戏
- PR最常见的实用技巧分享
- 图谱实战 | OPPO自研大规模知识图谱及其在小布助手中的应用
- 阿里云启动docker,出现 minergate-cli ,CPU占用100%
- A Lightweight IoT Cryptojacking DetectionMechanism in Heterogeneous Smart HomeNetworks
- JSoup快速入门-java解析html源码
- 计算机专业指南 专 平时作业,《计算机专业指南》课程作业要求
- elementUI中svg图标库
- 82岁“极客”老人借阿里云写族谱:想去云栖大会看马云!
- Vivado 多芯片型号工程切换