文章目录

    • 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随笔【附网络隐私闲谈】相关推荐

  1. 科学计算库Pandas的使用(附思维导图)

    pandas Pandas介绍 2008年WesMcKinney开发出的库: 专门用于数据挖掘的开源python库: 以Numpy为基础,借力Numpy模块在计算方面性能高的优势: 基于matplot ...

  2. 004.python科学计算库pandas(中)

    测试数据 titanic_train.csv isnull import pandastitanic_survival = pandas.read_csv("titanic_train.cs ...

  3. Python科学计算库 — Pandas数学统计方法

    首先导入pandas库 import numpy as np import pandas as pd Pandas 常用的数学统计方法如下表: 方法 说明 count 计算非NA值的数量 descri ...

  4. 【A-003】python数据分析与机器学习实战 Python科学计算库 Pandas数据分析处理库(二)

    目录: 处理缺失数据制作透视图删除含空数据的行和列多行索引使用apply函数 本节要处理的数据来自于泰坦尼克号的生存者名单,它的数据如下: PassengerId Survived Pclass .. ...

  5. 005.python科学计算库pandas(下)

    测试数据 fandango_score_comparison.csv series import pandas as pd from pandas import Seriesfandango = pd ...

  6. pandas删除数据库 python_Python常见的科学计算库

    科学计算包Pandas Pandas 是 Python 的核心数据分析支持库,提供了快速.灵活.明确的数据结构,旨在简单.直观地处理关系型.标记型数据. Pandas 的目标是成为 Python 数据 ...

  7. 机器学习——科学计算库(Numpy,Matplotlib,Pandas)

    机器学习--科学计算库中主要介绍的内容是人工智能深度学习过程常用的几个python库,主要有Numpy,Matplotlib,Pandas等,具体如下所示 在学习的过程中,我也从网上借鉴了多位大佬的优 ...

  8. Python_机器学习_常用科学计算库_第6章_ Seaborn+综合案例

    Python_机器学习_常用科学计算库_第6章_ Seaborn+综合案例 文章目录 Python_机器学习_常用科学计算库_第6章_ Seaborn+综合案例 Seaborn 学习目标 6.1 Se ...

  9. 【Python基础】科学计算库Scipy简易入门

    0.导语 Scipy是一个用于数学.科学.工程领域的常用软件包,可以处理插值.积分.优化.图像处理.常微分方程数值解的求解.信号处理等问题.它用于有效计算Numpy矩阵,使Numpy和Scipy协同工 ...

最新文章

  1. 剑指offer_第13题_调整数组顺序使奇数位于偶数前面
  2. 为数字资产交易设计安全的钱包架构
  3. 科学家王海峰:从百度十篇论文入选ACL 2019说起
  4. 【Groovy】Groovy 方法调用 ( 字符串切割 | 使用 Java 语法切割字符串 | 使用 Groovy 语法切割字符串直接为变量赋值 | 数组赋值给变量 变量个数小于等于数组长度 )
  5. C语言的本质(35)——共享库
  6. 子网划分详解与子网划分实例
  7. poj2441状态压缩dp基础
  8. Maven依赖配置和依赖范围
  9. 【转】JavaScript中的匿名函数及函数的闭包
  10. java8 comparator接口_Java8 Comparator 排序方法
  11. 微信小程序上传图片,视频及预览
  12. 算法:翻转图片Rotate Image
  13. 用直接分解法求方程组的C语言程序,LU分解法解线性方程组(C语言)
  14. 在线人民币大写转换器工具-把数字金额转换成中文大写
  15. 魔方还原算法学习笔记
  16. Deep learning for minimum mean-square error approaches to speech enhancement
  17. PHP:preg_match
  18. stm32f302实现斩波控制步进电机_电子产品装调与智能检测实训考核装置
  19. 《Journal of Building Engineering》期刊介绍(SCI 3区)
  20. 键盘事件keydown、keypress、keyup随笔整理总结

热门文章

  1. 一个简单的双骰子游戏
  2. PR最常见的实用技巧分享
  3. 图谱实战 | OPPO自研大规模知识图谱及其在小布助手中的应用
  4. 阿里云启动docker,出现 minergate-cli ,CPU占用100%
  5. A Lightweight IoT Cryptojacking DetectionMechanism in Heterogeneous Smart HomeNetworks
  6. JSoup快速入门-java解析html源码
  7. 计算机专业指南 专 平时作业,《计算机专业指南》课程作业要求
  8. elementUI中svg图标库
  9. 82岁“极客”老人借阿里云写族谱:想去云栖大会看马云!
  10. Vivado 多芯片型号工程切换