Skip to content

什么是Pandas

Pandas官方文档

  • Pandas 是 Python 语言的一个扩展程序库,用于数据分析。
  • Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。
  • Pandas 名字衍生自术语 "panel data"(面板数据)和 "Python data analysis"(Python 数据分析)。
  • Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。
  • Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。
  • Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。

Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例

Series

Series是一种类似于字典(dict-like)的一维数组(array-like)的对象,由下面两个部分组成:

  • values:一组数据(ndarray类型)
  • index:相关的数据索引标签
  • Series和ndarray一样,会强制类型统一

构造Series

  • From ndarray 使用ndarray构造 ,series是ndarray的一个引用对象。ndarray和series共用一块内存,series改变,ndarray也跟着改变。
  • From List 使用列表构造 ,series是list一个副本对象。ndarray和series不共用内存。series改变,list不会改变。
  • From dict 使用字典构造。
  • From scalar value,使用一个标量(常量或变量)构造时,必须指定index,标量会被重复匹配到每一个index

###使用ndarray构造

series是ndarray的一个引用对象。ndarray和series共用一块内存,series改变,ndarray也跟着改变。

image-20240330145813883

使用列表构造

series是list一个副本对象。ndarray和series不共用内存。series改变,list不会改变。series是list一个副本对象。ndarray和series不共用内存。series改变,list不会改变。

image-20240330145959587

使用字典构造

Series是一个dict-like对象,当然可以用字典直接构造

image-20240330150807572

使用一个标量(常量或变量)构造

From scalar value,使用一个标量(常量或变量)构造时,必须指定index,标量会被重复匹配到每一个index

image-20240330151022172

Series属性

  • name 返回Series对象的名字
  • shape 返回Series对象的形状
  • size 返回Series对象的元素个数
  • index 返回Series对象的显示索引
  • values 返回Sereis对象的所有元素值

image-20240330151619320

Sereis的数学运算

Series对大多数NumPy的函数都是兼容的

  • 与非pandas对象运算,服从广播机制原则
  • NumPy functions
  • Series之间运算
    • 索引对齐原则
    • 对不齐补空值, 使用add\sub\mul\div函数处理空值

与非pandas对象运算,服从广播机制原则

image-20240330151908783

###NumPy functions

image-20240330151959062

Series之间运算

  • 索引对齐原则
  • 对不齐补空值, 使用add\sub\mul\div函数处理空值

image-20240330154611933

image-20240330154644320

DataFrame

DataFrame是一个二维的表格型数据结构,可以看做是由Series组成的字典(共用同一个索引)。 DataFrame由按一定顺序排列的【多列】数据组成,每一列的数据类型可能不同。 设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。

  • 行索引:index
  • 列索引:columns
  • 值:values(numpy的二维数组)

构造DataFrame

  • From dict of Series or dicts 使用一个由Series构造的字典或一个字典构造
  • From dict of ndarrays / lists 使用一个由列表或ndarray构造的字典构造,ndarrays必须长度保持一致
  • From a list of dicts 使用一个由字典构成的列表构造
  • DataFrame.from_dict() 函数构造

image-20240330162110911

###使用一个由Series构造的字典或一个字典构造

image-20240330163640324

###使用一个由列表或ndarray构造的字典构造

image-20240330163711682

###使用一个由字典构成的列表构造

image-20240330163748903

DataFrame.from_dict() 函数构造

image-20240330163120461

DataFrame属性

  • dtypes
  • values
  • index
  • columns

image-20240330164238572

DataFrame运算

  • 与非pandas对象运算
  • 与Series对象运算
  • 与DataFrame对象运算
    • 索引对齐原则(row\columns)
    • 对不齐补空值, 使用add\sub\mul\div函数处理空值
  • NumPy functions
  • 转置运算

与非pandas对象运算

  • 要求符合广播机制,不符合就报错

image-20240417195202062

image-20240417195559469

与Series对象运算

  • 索引对齐原则,
  • 默认按列索引对齐,对不齐就补nan

image-20240417201834288

与DataFarme对象运算

  • 索引对齐原则
  • 行列索引同时对齐,对不齐就补nan
  • 要想按行索引对齐
    • 转置
    • 使用add/sub/mul/div函数,并可通过fill_value处理空值
    • fill_value不自持Series和DataFrame的运算

Python操作符与pandas操作函数对应表

Python OprationPandas Function
+add()
-sub() , subtract()
*mul() , multiply()
/truediv(), div() divide()
//floordiv()
%mod()
**pow()

image-20240417202210796

image-20240417202339813

NumPy Functions

image-20240417202449259

转置运算

image-20240417202519776

Pandas访问

Basics标准访问形式

Object TypeIndex
Seriess.loc[index]
DataFramedf.loc[row_index,column_index]
  • loc[] 显示访问:在pandas对象中,可以使用标签的形式访问数据

  • iloc[] 隐式访问:在pandas对象中,也可以使用index的形式访问数据

index可以是:

  • 索引
  • 索引列表
  • BOOL列表
  • 切片
  • 条件表达式

显示访问,使用Labels访问,loc[]

  • 索引切片时,左闭右开区间

  • 标签切片时,左右闭合区间

image-20240417204638623

image-20240417204723805

image-20240417204756974

image-20240417204833549

image-20240417204902217

隐式访问,使用indexies访问,iloc[]

  • index:每个元素距离首位地址的偏移量
python
series.iloc[index]

dataframe.iloc[row_index,column_index]

image-20240418185710129

image-20240418185759108

间接访问(禁止!!!)

  • 会让程序不知道访问的到底是df对象,还是切片对象,存在安全风险
  • Dataframe可以看成是Series组成的字典

image-20240418185942253

image-20240418190021964

image-20240418190050641

Pandas高级查找

where()和 mask()

  • where():满足con条件的保留,其他用other填充
  • mask():不满足con条件的保留,其他用other填充

where()

image-20240418190205945

image-20240418190251806

image-20240418190444791

mask()

image-20240418190519538

query()

  • query()不会用写df名字,直接写字段名就行

image-20240418190553932

filter() + 正则

  • 对行名和列名进行筛选

  • 使用item选择行,列名称,配合axis

  • 使用regex正则表达式,模糊匹配名称

image-20240418190627592

image-20240418190703865

image-20240418190728590

Pandas聚合操作

  • DataFrame默认是列方向的聚合
  • Pandas都自动忽略空值,不参与运算
Fuction备注
count个数
sum求和
nansum除了nan之外的求和
cumsum累加
mean平均
mad绝对值均值
median中位数
min最小值
max众数
abs绝对值
prod乘积
cumprod累积
std标准差
var方差
quantitle分位数

image-20240418190819087

image-20240418190858393

image-20240418190932490

image-20240418191000590

习题

markdown
背景:假设班级有 张三、李四、王五、赵六四位同学,考试要考的科目有Python、Java、C

1. 假设score1是期中考试成绩,score2是期末考试成绩,请自由创建score1和score2,并将其相加,求期中期末平均值。

2. 假设张三期中考试Java被发现作弊,要记为0分,如何实现?

3. 李四因为举报张三作弊立功,期中考试所有科目加10分,如何实现?

4. 由于有一道题出错,要给所有学生加10分,如何实现?

5. Python老师想知道哪些同学的Java成绩比Python好,如何实现?

image-20240418191132469

image-20240418191228445

image-20240418191259869

image-20240418191328680

索引

单层索引

  • 使用pd.Index()可以定制索引
  • pd.Index()可以给索引加name
markdown
#怎么使用索引:
pd.Index是pandas提供的专门用于构造索引的类,它有很多子类,CategoricalIndex, RangeIndex
所有的子类都具备Index类的特点,比如可以使用索引访问元素

通常如果需要对索引定制(name),可以使用pd.Index系列方法来构造索引

如果没有特殊需求,使用普通的列表完全没有问题

image-20240418191733937

代码示例:

image-20240418191746320

image-20240418191754923

image-20240418191922673

多层索引

多层索引构造

  • 使用pd.MultiIndex.from_arrays()
  • 使用pd.MultiIndex.from_tuples()
  • 使用 pd.MultiIndex.from_product()

使用pd.MultiIndex.from_arrays()

image-20240418192154394

使用pd.MultiIndex.from_tuples()

image-20240418192258658

使用 pd.MultiIndex.from_product()

image-20240418192354914

image-20240418192430584

多层索引访问

显式索引访问

python
# 显示索引
df.loc[row_labels, col_labels]

s.loc[labels]

labels: 标签名称  标签名称列表  条件表达式  Bool列表  切片

image-20240419132145351

  • 多层索引本质就是个元组,除此之外访问逻辑完全一致

image-20240419132247893

image-20240419132327614

  • 可以从外层索引开始,一级一级向内访问,但不能越级访问。
    • 会变成间接访问的模式
    • 读的话没办法
    • 但不要往里写数据,安全问题!!!

image-20240419132605597

  • 使用切片索引访问时,先排序,不然报错UnsortedIndexError。
    • 排序:df.sort_index()

image-20240419133041368

隐式索引访问

正常的行列逻辑,不赘述。

image-20240419133201538

Stack和Unstack操作

  • Unstack: 把index变为columns
  • Stack:把columns变为index
  • level:最里层为-1

image-20240419133814356

练习

markdown

1. 创建一个DataFrame,表示出lucy,tom,jack期中期末各科(python,java,c)成绩
2. 获取上学期lucy成绩的最高分是哪门学科
3. 同时获取上学期和下学期tom的成绩,计算tom的各学科的平均成绩
4. 获取上学期jack的python成绩,并给他加20分

image-20240419140111695

image-20240419140144884

image-20240419140300674

image-20240419140527406

数据IO操作

  • pandas的 IO操作主要是读取有特定格式的文件

image-20240419143111908

pd.read_csv()

image-20240419143856353

pd.read_table()

image-20240419143948741

excel读取

image-20240419144056473

数据探索

  • Describe()
  • Info()
  • Head()
  • Tail()
  • Sample(),随机抽样

image-20240419145203967

image-20240419145239658

image-20240419145310641

空值处理

基本就俩思路,看情况选:

  • 删掉空值
  • 把非空数据过滤出来

None

  • None是Python自带的,其类型为python object。
  • None不能参与到任何计算中。
  • object类型的运算要比int类型的运算慢得多

image-20240419150251042

np.nan

  • np.nan是numpy提供的 一个常量,用于表达空值,是一个float,能参与到计算中。

  • NaN(not a number) 是一个符号,不是一个量。

  • pandas对象中,所有的np.nan都是以NaN展示

  • 在numpy中,可以使用np.nanxxx()函数来计算nan,此时视nan为0。

pandas自动把None处理成np.nan

image-20240419150443685

空值查找

  • Isnull()
  • notnull()

image-20240419152243047

image-20240419152314916

image-20240419152348752

image-20240419152425370

image-20240419152519404

空值填充

  • fillna()

整个表格中的统一填充方法

image-20240419154838858

使用均值来填充空值

image-20240419154931788

可以使用序列(Series)来批量填充, 默认列索引对齐

image-20240419155046731

image-20240419155259161

使用临近值填充,不需要再指定value

image-20240419155429913

空值过滤

基本就俩思路

  • 过滤出非空数据

    • isnull() , notnull()

    • any(),all()

    • 以上两个函数结合来确定一个最终条件,然后再利用loc访问,实现过滤非空数据

  • 删除有空值的行

    • dropna()

过滤非空数据

image-20240420091719937

image-20240420091800103

删除空值

image-20240420092540567

image-20240420092611690

异常值处理

异常值:简单说就是不能代表普遍规律的值,用来建模会出问题

  • 不符合统计学特征的值
  • 不符合业务逻辑的值

异常值分析

使用describe()来分写每一列的描述性统计量

异常值认定

不符合业务逻辑的异常值

image-20240420093325461

使用平均值和标准差进行判断

  • 大于3倍标准差的可以视为异常值

    image-20240420101200584

image-20240420101242758

image-20240420101319769

使用上四中位数和下四中位数进行异常值判定

  • ,可以先画个箱型图看一眼

image-20240420101951168

image-20240420102048772

image-20240420102116700

image-20240420103050634

异常值处理

  • 删除
    • df.drop()
  • 过滤

过滤删除本质是一样的,不必特意区分

重复值处理

  • 检查
  • 过滤
  • 删除方法

检查重复值

  • df.duplicated()

image-20240420104302569

image-20240420104346307

image-20240420104500450

过滤重复值

image-20240420104903090

删除重复值

  • drop_duplicates()

    • image-20240521144510294

    • 删除重复值之后,索引是乱的,重置索引

      python
      # 把reset_index() 里的drop参数设置为True即可
      df_area_process.drop_duplicates().reset_index(drop=True)

      image-20240521144655418

  • 通用的dropo()函数

image-20240420105051403

排序与随机抽样

排序

  • sort_index()
  • sort_values()

image-20240420105852756

image-20240420105926787

随机抽样

  • sample(),随机取n行或n列。
  • take(),传人索引且只关注隐式索引。

image-20240420105958710

image-20240420110049079

索引设置

  • set_index(),把某一列数据设置为索引。
  • reset_index(),把上面设置为索引的列恢复回去。
  • reindex()
  • droplevel()

image-20240420110610217

image-20240420110636852

image-20240420110705590

映射处理

  • rename()
  • replace()
  • map()

rename()

image-20240420155349967

image-20240420155416501

replace()

replace()支持Series对象和DataFrame对象

  • list

image-20240420160729104

  • dict

image-20240420160807475

image-20240420160837100

  • regex

image-20240420160917753

map()

map()只支持Seires对象,和replace()不同

  • 模糊匹配

image-20240420162338920

  • 精确匹配

image-20240420162547035

map()函数可以同时结合字典和函数使用,达到更精确的匹配

image-20240420162623515

markdown
# 字典里有H就匹配H,
# 没有H就通过get()匹配默认值a

Pandas级联

级联

  • 核心是索引对齐原则

  • 要求数据结构一致

  • 校验级联后是否有重复索引用参数veriy_integrity = True ,使用后如果有重复索引会报错

  • 解决重复索引2种方式:

    • 使用多层索引解决,使用参数keys
    • 忽略索引的方式解决,使用ignore_index = True参数
  • join = inner ,join = outer两个参数决定级联后取交集还是并集

    • 不建议使用join = inner,容易丢失数据

image-20240420165341604

image-20240420165421111

  • 校验级联后是否有重复索引用参数veriy_integrity = True ,使用后如果有重复索引会报错

image-20240420165452517

python
# 报错信息如下
# ValueError: Indexes have overlapping values: Int64Index([0], dtype='int64')
  • 解决重复索引2种方式:
    • 使用多层索引解决,使用参数keys
    • 忽略索引的方式解决,使用ignore_index = True参数

image-20240420165610089

  • 核心是索引对齐原则

image-20240420165806731

  • join = inner ,join = outer两个参数决定级联后取交集还是并集
    • 不建议使用join = inner,容易丢失数据

image-20240420165947610

image-20240420170037689

合并

  • pd.merge()

  • 合并就是根据两张表的公共信息,把两张表的数据汇总的方法。

  • 合并以列的内容为参考标准,不存在行合并,都是列合并

  • 合并的列通常是离散型数据。可以是数值型

  • 合并的列之间存在一对一、一对多、多对多关系,否则合并结果为空

  • 参数:

    • left/right:左右表名字

    • Left_on/right_on:按左右表的那一列合并

    • how:inner/outer,合并后取交集还是并集

    • on:按那一列合并

    • suffixes:合并后给列索引加名字后缀,用来区分两张表

image-20240420171212611

image-20240420171250476

image-20240420171316651

image-20240420172844324

image-20240420172924524

image-20240420172955851

image-20240420173023093

image-20240420173046023

image-20240420173130937

image-20240420173154272

image-20240420173223949

分组

  • groupby()

    • 单分组
    • 多分组
  • df.groupby(by=['分组字段']).groups,查看具体的分组情况

  • 分组必聚合

  • df.groupby(by=['分组字段']).agg(),定制多种聚合指标

  • apply(),自定义聚合方式

image-20240421095750321

groupby()

单分组

image-20240421095938908

多分组

image-20240421100204551

groups

可以用于查看DataFrameGroupBy所表达的分组情况

image-20240421100034479

agg(),定制多种聚合指标

image-20240421100313272

apply(),自定义聚合方式

image-20240421100412324

交叉表和透视表

交叉表

  • 交叉表只统计数量count

image-20240421101237153

透视表

  • 交叉表想统计什么都可以。

  • data 数据源 就是要进行透视的DataFrame对象

  • index\columns 透视表的行列是从数据源的哪列提取的

  • values 是要统计的数据源中的字段

  • aggfunc 是聚合方法,传递的是函数名字

image-20240421101400080