001-Pandas的数据结构
Pandas的数据结构
Pandas(Python Data Analysis Library)是基于NumPy
的一种工具,该工具是为了解决数据分析任务而创建的。Pandas
纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。它是使Python成为强大而高效的数据分析环境的重要因素之一。Pandas专用于数据预处理和数据分析的Python第三方库,最适合处理大型结构化表格数据.
Pandas有三大数据结构,Series、DataFrame以及Panel。
- Series(一维数据)
- DataFrame(二维数据)
- Panel(三维结构数据/面板数据)
注释:对于Panel,会很少使用,通常会使用MultiIndex这种结构解决三维数据表示问题
1、Series
Series 是 Pandas 中最基础的一维数据结构,类似于带标签的数组或字典。它是构建 DataFrame 的基础(DataFrame
可以看作是由多个 Series 组成的)。
Series 由两部分组成:
- 索引(index):标签,用于标识数据.
- 数据值(values):可以是任何 NumPy 支持的数据类型
Series 的基本特性:
- 一维数据结构:类似于 Python 列表或 NumPy 数组,但功能更强大
- 带索引的数组:每个元素都有对应的标签(索引)
- 可以存储任何数据类型:整数、字符串、浮点数、Python对象等
- 大小不可变:创建后不能改变大小(但可以修改内容)
1.1、Series的结构
import pandas as pd
#1.1从列表创建,仅有数据列表即可产生最简单的Series
s = pd.Series([1, 3, 5, 7, 9]) 0 1 # 仅有数据列表即可产生最简单的Series
1 3 # 左侧为索引,右侧是数据
2 5
3 7
4 9
dtype: int64# 获取索引
s.index
RangeIndex(start=0, stop=5, step=1)# 获取数据
s.values
array([1, 3, 5, 7, 9])
1.2、Series的创建
仅有数据列表即可产生最简单的Series
例如上面的代码
从字典创建Series(字典的键会成为索引)
data = {'a': 1, 'b': 2, 'c': 3}
s = pd.Series(data)
s
运行结果:
a 1
b 2
c 3
dtype: int64
指定索引创建Series
s = pd.Series([1, 2, 3], index=['x', 'y', 'z'])
s
运行结果:
x 1
y 2
z 3
dtype: int64
使用标量值创建Series(所有值相同)
s = pd.Series(5, index=['a', 'b', 'c'])
s
运行结果:
a 5
b 5
c 5
dtype: int64
1.3、根据标签索引查询数据
# 1.创建一个带有自定义索引的pandas Series# 数据包含混合类型:[整数1, 字符串'a', 浮点数5.2, 整数7]# 索引为:['d', 'b', 'c', 'a']
s2 = pd.Series([1,'a',5.2,7],index=['d','b','c','a'])# 输出:
d 1 → 索引'd'对应值1
b a → 索引'b'对应字符串'a'
c 5.2 → 索引'c'对应浮点数5.2
a 7 → 索引'a'对应值7
dtype: object → 由于包含混合类型,整体类型为object# 2.通过索引标签'a'访问Series中的单个元素
s2['a'] # 返回索引'a'对应的值: #7# 3.查看单个元素的数据类型
type(s2['a']) ## int → 因为值7是整数类型# 4.通过索引标签列表访问多个元素
s2[['b','a']]
# 输出:
b a → 索引'b'对应字符串'a' #返回一个新的Series,包含索引'b'和'a'对应的值
a 7 → 索引'a'对应值7
dtype: object #新Series的类型仍然是object# 5.查看多元素访问结果的数据类型
type(s2[['b','a']])
输出:
pandas.core.series.Series # 返回的是一个Series对象,而不是单个值
2、DataFrame
DataFrame是pandas库中最重要、最常用的数据结构,它是一个二维的、大小可变的、可以包含异构类型数据的表格型数据结构,类似于Excel表格或SQL数据库中的表。
DataFrame的基本特性:
- 二维表格结构:由行和列组成,既有行索引也有列索引
- 列可以包含不同类型的数据:数值、字符串、布尔值等
- 大小可变:可以动态添加/删除行或列
- 强大的数据操作功能:排序、筛选、分组、聚合等
# 创建一个字典数据,每个键对应一个列名,值是该列的数据列表。即:使用字典数据创建DataFrame
data = {'名称': ['张三', '李四', '王麻子', '刘二'], # 姓名列,包含4个字符串'年龄': [25, 32, 18, 47], # 年龄列,包含4个整数'城市': ['苏州', '杭州', '深圳', '重庆'], # 城市列,包含4个字符串'分数': [85, 90, 78, 92] # 分数列,包含4个整数
}df = pd.DataFrame(data)
df
# 显示DataFrame的内容输出,自动生成默认的行索引:0, 1, 2, 3名称 年龄 城市 分数
0 张三 25 苏州 85
1 李四 32 杭州 90
2 王麻 18 深圳 78
3 刘二 47 重庆 92# 查看DataFrame中各列的数据类型
df.dtypes名称 object → 字符串类型
年龄 int64 → 64位整数类型
城市 object → 字符串类型
分数 int64 → 64位整数类型
dtype: object# 查看DataFrame的列名(列索引)
df.columns
Index(['名称', '年龄', '城市', '分数'], dtype='object') #返回一个Index对象,包含所有列名# 查看DataFrame的行索引
df.index
RangeIndex(start=0, stop=4, step=1) #表示行索引从0开始,到4结束(不包括4),步长为1,即索引为[0, 1, 2, 3]
DataFrame中查询出Series
- 如果只查询一行、一列,返回的是pd.Series
- 如果查询多行、多列,返回的是pd.DataFrame
# 创建一个字典数据,包含4个键值对,每个键对应一个列名,值是该列的数据列表
data = {'名称': ['张三', '李四', '王麻', '刘二'], # 姓名列'年龄': [25, 32, 18, 47], # 年龄列 '城市': ['苏州', '杭州', '深圳', '重庆'], # 城市列'分数': [85, 90, 78, 92] # 分数列
}# 使用字典数据创建pandas DataFrame
df = pd.DataFrame(data)# 1. 查询列# 1.1 查询单列 - 使用方括号和列名字符串
# 返回一个pd.Series对象,包含该列的所有数据
df["名称"]0 张三
1 李四
2 王麻
3 刘二
Name: 名称, dtype: object # Name显示列名,dtype显示数据类型# 查看单列查询结果的类型type(df['名称'])
pandas.core.series.Series # 单列查询返回Series对象# 1.2 查询多列 - 使用方括号和列名列表
df[["名称","年龄"]]名称 年龄
0 张三 25 # 返回一个DataFrame对象,包含指定的多列数据
1 李四 32
2 王麻 18
3 刘二 47# 查看多列查询结果的类型
# 返回:pandas.core.frame.DataFrame → 多列查询返回DataFrame对象
type(df[["名称","年龄"]])
pandas.core.frame.DataFrame# 2. 查询行# 2.1 查询单行 - 使用loc和行索引
# 返回一个pd.Series对象,包含该行的所有数据
df.loc[1]
# 输出:
# 名称 李四
# 年龄 32
# 城市 杭州
# 分数 90
# Name: 1, dtype: object # Name显示行索引,dtype显示数据类型# 查看单行查询结果的类型
# 返回:pandas.core.series.Series → 单行查询返回Series对象
type(df.loc[1])# 2.2 查询多行 - 使用loc和切片操作
# 返回一个DataFrame对象,包含指定的多行数据
# 注意:loc切片是包含结束位置的,即包含索引1到3的所有行
df.loc[1:3]名称 年龄 城市 分数
1 李四 32 杭州 90
2 王麻 18 深圳 78
3 刘二 47 重庆 92# 查看多行查询结果的类型
# 返回:pandas.core.frame.DataFrame → 多行查询返回DataFrame对象
type(df.loc[1:3])
关键区别总结
特性 | 选择单列 df['姓名'] | 选择多列 df[['姓名', '年龄']] |
---|---|---|
语法 | 单中括号 + 字符串 | 双中括号 + 列表 |
返回值 | Series (一维) | DataFrame (二维) |
用途 | 获取单独一列的数据 | 获取一个由多列组成的子集表格 |
类比 | 从Excel中复制一列 | 从Excel中复制几列到一个新工作表 |
为什么这个区别很重要?
因为Series和DataFrame有不同的方法和属性。例如,你可以对Series计算平均值(如果它是数字类型),但对DataFrame你可以进行更复杂的操作,比如同时处理多个列的关系。