Python 12_Python数据处理之Pandas库

一、Pandas库概述

1.1 Pandas库简介

Pandas 是一个开源的 Python 数据分析支持库,它是Python编程语言的一个第三方库,用于数据清洗和分析。Pandas提供了快速、灵活和表达力强的数据结构,旨在简单、直观地处理关系型、标记型数据。并且它是基于NumPy开发,可以与其它第三方科学计算支持库完美集成。

Pandas专门设计用于处理以下类型的数据:

  • 与 SQL 或 Excel 表类似的,含异构列的表格数据;
  • 有序和无序(非固定频率)的时间序列数据;
  • 带行列标签的矩阵数据,包括同构或异构型数据;
  • 任意其它形式的观测、统计数据集, 数据转入 Pandas 数据结构时不必事先标记。

Pandas的主要数据结构是 Series(一维数据)与 DataFrame(二维数据):

名称 维数 描述
Series 1维 带标签(索引)的一维(一般数据类型相同)数组
DataFrame 2维 带标签(索引)的,大小可变的,二维异构表格

Pandas 数据结构就像是低维数据的容器。可以这样理解,DataFrame 是 Series 的容器,Series 则是标量的容器。因此,可以在容器中以字典的形式插入或删除对象。

1.2 Pandas能做什么

  • 数据读取:从CSV、Excel、SQL等多种数据源读取数据。
  • 数据清洗:处理缺失值、去除重复数据、数据类型转换等。
  • 数据探索:提供描述性统计、数据过滤、分组等操作。
  • 数据可视化:与Matplotlib、Seaborn等库结合,绘制各种图表。
  • 时间序列分析:提供了丰富的时间序列功能,包括时间戳、频率转换、移动窗口统计等。

简而言之,Pandas是一个多用途的数据分析工具,它几乎可以处理任何与数据相关的任务,从数据的导入、处理到分析和可视化。

二、Pandas库核心数据结构 之 Series

2.1 Series 数据结构概述

Series 是 Pandas 中最基本的数据结构,它是是一种类似于一维数组的对象,由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成:

  • values:一组同构(数据类型相同)数组(ndarray类型),数组元素类型可以是任何数据类型(整数、字符串、浮点数、Python对象等)。
  • index:相关的数据索引标签。每个元素都有一个索引标签,这使得 Series 非常适合用于表示具有明确标签的数据。

Series的特点:

  • 一维数组:Series是一维的,这意味着它只有一个轴(或维度),类似于 Python 中的列表。
  • 索引: 每个 Series 都有一个索引,索引可以是整数、字符串、日期等类型。如果不指定索引,Pandas 将默认创建一个从 0 开始的连续整数索引。
  • 数据类型: Series 可以容纳不同数据类型的元素,包括整数、浮点数、字符串、Python 对象等。
  • 大小不变性:Series 的大小在创建后是不变的,但可以通过某些操作(如 append 或 delete)来改变。
  • 操作:Series 支持各种操作,如数学运算、统计分析、字符串处理等。
  • 缺失数据:Series 可以包含缺失数据,Pandas 使用 NaN(Not a Number)来表示缺失或无值。

2.2 创建 Series

使用 pd.Series() 构造函数创建一个 Series 对象,传递一个数据数组(可以是列表、NumPy 数组等)和一个可选的索引数组。

1
pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)

参数说明:

  • data:Series 的数据部分,可以是 标量值、元组、列表、数组、字典等。如果不提供此参数,则创建一个空的 Series。
  • index:Series 的数据索引标签。如果不指定索引参数,创建的 Series 将自动添加默认从 0 开始的连续整数索引;如果指定索引参数的话,使用列表或者元组格式进行指定,其中列表或者元组的长度需要 和 data 的数据行数一致。索引列表的元素类型可以是 数值(连续整数 或 不连续整数都可以)、字符、字符串等数据类型。
  • dtype:指定 Series 的数据类型。可以是 NumPy 的数据类型,例如 np.int64、np.float64 等。如果不提供此参数,则根据数据自动推断数据类型。如果 data 中数据类型不同时 dtype 为 object 。
  • name:Series 的名称,用于标识 Series 对象。如果提供了此参数,则创建的 Series 对象将具有指定的名称。
  • copy:是否复制数据。默认为 False,表示不复制数据。如果设置为 True,则复制输入的数据。
  • fastpath:是否启用快速路径。默认为 False。启用快速路径可能会在某些情况下提高性能。

示例:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
import sys
import pandas as pd
import numpy as np

li = [9, 8, 7, 6, 5]

print("1.创建一个空Series对象:")
print(pd.Series())

print("\n2.由列表创建Series, 默认索引为 0 到 N-1 的整数型索引:")
print(pd.Series(li))
'''
输出结果:
0    9
1    8
2    7
3    6
4    5
dtype: int64
'''

print("\n3.由numpy创建Series, 默认索引为 0 到 N-1 的整数型索引:")
lis = np.array(li)
print(pd.Series(lis))
'''
0    9
1    8
2    7
3    6
4    5
dtype: int64
'''

print("\n4.利用 index 属性,在创建的时候指定索引:")
print(pd.Series(li, index=[list('ABCDE')]))
# print(pd.Series(li, index = ["A", "B", "C", "D", "E"]))
'''
输出结果:
A    9
B    8
C    7
D    6
E    5
dtype: int64
'''

print("\n5.使用 key/value 对象,类似字典来创建 Series:")
a = {'a': [1, 2, 3],
     'b': 2,
     'c': 3,
     'd': 4}
print(pd.Series(a))
'''
输出结果:
a    [1, 2, 3]
b            2
c            3
d            4
dtype: object
'''

print("\n6.标量值创建Series对象,标量值按照index的数量进行重复,并与其一一对应:")
print(pd.Series(5, index = [0,1,2,3])) # 如果data是标量值,则必须提供索引
'''
输出结果
0    5
1    5
2    5
3    5
dtype: int64
'''

print("\n7.设置Series名称参数:")
print(pd.Series(li, name="SeriesTEST" ))
'''
输出结果:
0    9
1    8
2    7
3    6
4    5
Name: SeriesTEST, dtype: int64
'''

print("\n8.data 为异构集合(元素类型不完全相同)类型:")
print(pd.Series([9, 8, 7, 6, "saas"]))
'''
输出结果:
0       9
1       8
2       7
3       6
4    saas
dtype: object
'''

print("\n9.索引为不连续整数:")
print(pd.Series(li, [10, 120, 20, -26, 0]))
'''
输出结果:
 10     9
 120    8
 20     7
-26     6
 0      5
dtype: int64
'''

2.3 Series的索引操作

Series 有两套索引:

  • 隐式索引:为固定索引,是在创建 Series 时自动创建从 0 开始的连续递增整数索引,故称为 隐式索引,Series 使用 arr.iloc[num](如arr.iloc[0] —— arr.iloc[len(arr)-1])进行隐式索引的操作;
  • 显示索引:为可选索引,是创建 Series 时使用 index 参数指定的索引,故称为 显示索引, index 索引参数可以是 整数、浮点数、字符、字符串、日期、等Python 值类型对象 组成的 列表、元组对象,通常索引的 数据类型全部相同,也可以不同。可以使用 arr[idx]arr.loc[idx] 对 Series 的显示索引进行索引操作,对应字符 或 字符串 类型的索引,也可以使 arr.index_name 方式 操作索引,如 索引为字符 ‘a’ 则 可以使用 arr.a 或 索引为字符串 “one” 则 可使用 arr.one 操作索引。

Tips: 当 显示索引也为 从 0 开始递增的整数 时, a[i] == a.loc[i] == a.iloc[i]

单索引操作:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
import pandas as pd
import numpy as np

li = [90, 80, 70, 60, 50]

print("1.默认索引(从 0 开始的连续递增整数):")
a = pd.Series(li)
print(a)
print(a[0], a.loc[1], a.iloc[0], a.iloc[len(a)-1], a[0] == a.iloc[0], a.loc[1] == a.iloc[1])
'''
输出结果:
1.默认索引(从 0 开始的连续递增整数):
0    90
1    80
2    70
3    60
4    50
dtype: int64
90 80 90 50 True True
'''

print("\n2.任意连续递增整数索引:")
a = pd.Series(li, index = [-2, -1, 0, 1, 2])
print(a)
print(a[-1], a.loc[-2], a.iloc[0], a.iloc[len(a)-1], a[0] == a.iloc[0], a.loc[1] == a.iloc[1])
'''
输出结果:
2.任意连续递增整数索引:
-2    90
-1    80
 0    70
 1    60
 2    50
dtype: int64
80 90 90 50 False False
'''

print("\n3.任意连续递减整数索引:")
a = pd.Series(li, index = [2, 1, 0, -1, -2])
print(a)
print(a[-1], a.loc[-2], a.iloc[0], a.iloc[len(a)-1], a[0] == a.iloc[0], a.loc[1] == a.iloc[1])
'''
输出结果:
3.任意连续递减整数索引:
 2    90
 1    80
 0    70
-1    60
-2    50
dtype: int64
60 50 90 50 False False
'''

print("\n4.任意不连续整数索引:")
a = pd.Series(li, index = [10, -9, 0, 17, -6])
print(a)
print(a[-6], a.loc[-9], a.iloc[0], a.iloc[len(a)-1], a[0] == a.iloc[0], a.loc[1] == a.iloc[1])
'''
输出结果:
4.任意不连续整数索引:
 10    90
-9     80
 0     70
 17    60
-6     50
dtype: int64
50 80 90 50 False False
'''

print("\n5.任意浮点数索引:")
a = pd.Series(li, index = [10.1, -9.2, 0.3, 17.4, -6.5])
print(a)
print(a[-6.5], a.loc[-9.2], a.iloc[0], a.iloc[len(a)-1])
'''
输出结果:
5.任意浮点数索引:
 10.1    90
-9.2     80
 0.3     70
 17.4    60
-6.5     50
dtype: int64
50 80 90 50
'''

print("\n6.任意字符/字符串索引:")
dic = {'a': 10,
       'b': 20,
       'c': 30,
       "four": 40,
       'e': 50}
a = pd.Series(dic)
print(a)
print(a['a'], a.loc["four"], a.c, a.four, a.iloc[0], a.iloc[len(dic)-1])
'''
输出结果:
6.任意字符/字符串索引:
a       10
b       20
c       30
four    40
e       50
dtype: int64
1 4 3 4 1 5
'''