人工智能数据分析中的Pandas:深入理解DataFrame
前言
在数据科学领域,Pandas 是处理结构化数据的核心工具之一。其中,DataFrame 作为其最核心的二维数据结构,广泛应用于数据清洗、分析与建模过程中。它类似于电子表格或数据库表,能够高效管理带有行标签和列标签的异构数据。本文将系统性地介绍 DataFrame 的定义、特性、创建方法、关键属性、数据选取方式以及常用操作,帮助读者全面掌握这一重要工具。
一、DataFrame 概述
DataFrame 是一种带标签的二维数据容器,支持不同类型的列数据(如整数、浮点数、字符串、布尔值等),适用于存储和操作表格型数据。它的主要构成包括:
- 行(Rows):每行代表一个独立的数据记录,例如一个人的信息或一次交易日志。
- 列(Columns):每一列表示一个特征变量,如“姓名”、“年龄”或“城市”,且各列可拥有不同的数据类型。
- 索引(Index):用于标识每一行,默认为从0开始的整数序列,但也可自定义为日期、ID等有意义的标签。
- 列名(Columns):列的名称标签,通常为字符串,要求唯一,可用于快速访问数据。
? 理解提示:
DataFrame 可视为由多个共享相同索引的 Series 组成的字典结构,每个 Series 对应一列数据。
二、DataFrame 的核心特点
| 特性 | 说明 |
|---|---|
| 二维表格结构 | 具备行列结构,支持混合数据类型,适合处理真实世界中的复杂数据集 |
| 自动对齐机制 | 在进行算术运算或合并操作时,会根据行索引和列名自动匹配对应位置的数据 |
| 缺失值处理能力 | 使用 表示空值(NaN),允许存在缺失而不破坏整体结构 |
| 灵活的数据访问方式 | 支持基于标签的索引 、基于位置的索引 以及布尔条件筛选 |
| 高度可扩展性 | 支持动态增删行列,并提供连接、合并、重塑等多种高级操作 |
| 与 NumPy 兼容性 | 可通过 提取底层的 NumPy 数组,便于数值计算集成 |
三、构建 DataFrame 的六种常见方法
1. 使用字典创建(最常用方式)
通过键值对形式传入数据,字典的键作为列名,值(需为等长列表或数组)作为列内容。
import pandas as pd
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 35],
'城市': ['北京', '上海', '广州']
}
df = pd.DataFrame(data)
2. 基于嵌套列表(列表的列表)
将数据以二维列表形式组织,并通过 columns 参数指定列名。
data = [['张三', 25, '北京'],
['李四', 30, '上海'],
['王五', 35, '广州']]
df = pd.DataFrame(data, columns=['姓名', '年龄', '城市'])
3. 利用 Series 字典构造
将多个 Pandas Series 作为字典的值进行组合,每个 Series 自带名称与索引。
s1 = pd.Series([25, 30, 35], name='年龄')
s2 = pd.Series(['北京', '上海', '广州'], name='城市')
df = pd.DataFrame({'年龄': s1, '城市': s2})
4. 从 NumPy 数组生成
利用随机数组或其他 NumPy 数据初始化 DataFrame,同时可设定列名与行索引。
import numpy as np
arr = np.random.randn(3, 2)
df = pd.DataFrame(arr, columns=['A', 'B'], index=['x', 'y', 'z'])
5. 读取外部文件(实际应用中最普遍)
直接加载本地或远程文件中的结构化数据。
# CSV 文件
df = pd.read_csv('data.csv')
# Excel 文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# JSON 文件
df = pd.read_json('data.json')
6. 创建空的 DataFrame
用于初始化结构,在后续过程中逐步填充数据。
# 创建完全空白的 DataFrame
df_empty = pd.DataFrame()
# 或预先定义列名
df_empty = pd.DataFrame(columns=['姓名', '年龄'])
四、DataFrame 的关键属性一览
以下是常用的内置属性及其功能说明:
| 属性 | 说明 | 示例 |
|---|---|---|
|
行索引标签 | |
|
列名集合 | |
|
获取底层 NumPy 数组 | 适用于需要数值计算的场景 |
|
返回数据形状(行数 × 列数) | |
→ |
查看每列的数据类型 | 和 结合使用更清晰 |
|
统计总元素个数 | |
|
返回维度数量(始终为2) | |
|
实现行列转置 | |
五、数据访问与选择(重点内容)
准确高效地提取所需数据是数据分析的关键步骤,主要包括以下几种方式:
1. 选择列
可以通过列名直接选取单列(返回 Series)或多列(返回 DataFrame)。
# 单列选择
df['姓名']
# 多列选择
df[['姓名', '年龄']]
2. 选择行
支持通过标签索引(.loc)或位置索引(.iloc)来获取特定行。
# 按标签选取
df.loc[0]
# 按位置选取
df.iloc[1]
3. 同时选择行与列
结合 .loc 或 .iloc 实现行列联合筛选。
# 标签方式
df.loc[0:1, ['姓名', '城市']]
# 位置方式
df.iloc[0:2, 0:2]
4. 布尔索引(条件筛选)
根据逻辑条件过滤出满足要求的数据子集。
# 筛选年龄大于30的记录
df[df['年龄'] > 30]
六、常用数据操作技巧
1. 添加新列
可在现有 DataFrame 中插入新的字段。
df['性别'] = ['男', '女', '男']
2. 删除行或列
使用 drop 方法移除不需要的部分。
# 删除某一列
df.drop('城市', axis=1, inplace=True)
# 删除某一行
df.drop(0, axis=0, inplace=True)
3. 重命名列名
便于统一命名规范或提升可读性。
df.rename(columns={'姓名': 'Name'}, inplace=True)
4. 数据排序
按某一列或多列进行升序或降序排列。
df.sort_values(by='年龄', ascending=False)
5. 缺失值处理
识别并处理空值(NaN),常用方法包括删除或填充。
# 删除含空值的行
df.dropna()
# 填充空值
df.fillna(0)
6. 描述性统计分析
快速获取数据的基本统计信息。
df.describe() # 包括计数、均值、标准差、分位数等
七、高级功能概览
Pandas 提供了丰富的进阶功能,如:
- 数据透视表(pivot_table)
- 分组聚合(groupby)
- 时间序列处理
- 多级索引支持
- 数据合并与连接(merge/join)
这些功能极大地增强了对复杂数据集的操作能力。
八、注意事项与最佳实践
- 尽量避免频繁修改原始数据,建议使用 copy() 创建副本操作。
- 合理使用 inplace 参数,显式赋值更利于代码可读性。
- 优先采用向量化操作而非循环,提高执行效率。
- 定期检查数据类型,确保 dtype 正确以避免计算错误。
- 对于大型数据集,考虑使用 chunksize 分块读取文件。
九、总结
本文围绕 Pandas 中的 DataFrame 展开,系统介绍了其基本概念、创建方式、核心属性、数据选取方法及常见操作。作为数据分析流程中的基石,熟练掌握 DataFrame 的使用是进入数据科学领域的必要技能。通过灵活运用其提供的各种功能,可以高效完成从数据导入到预处理再到分析输出的全流程任务。
后续学习方向
建议进一步学习 GroupBy 操作、时间序列分析、数据可视化集成(如 Matplotlib/Seaborn)等内容,以全面提升数据分析实战能力。
一、选择列
通过列名选取数据时,返回结果的类型取决于所选内容:
- df['姓名']:返回一个 Series,表示单列数据。
- df[['姓名', '年龄']]:使用双层中括号可返回 DataFrame,适用于多列选取。
二、行数据的选取方式
1. 按标签索引(推荐方式):
- df.loc[0]:获取标签为 0 的整行数据。
- df.loc[0:1]:按标签进行切片操作,包含起始和结束标签对应的行。
2. 按位置索引(整数位置):
- df.iloc[0]:选取第 0 行(基于位置,从 0 开始计数)。
- df.iloc[0:2]:位置切片,范围左闭右开,不包含末尾索引。
三、行列同时筛选
在实际分析中常需同时指定行与列:
- df.loc[0, '姓名']:提取特定位置的单一值。
- df.loc[0:1, ['姓名', '年龄']]:按标签选取子集区域。
- df.iloc[0:2, 0:2]:以整数位置方式选取前两行和前两列的数据块。
四、条件筛选:布尔索引
利用逻辑表达式实现数据过滤:
- df[df['年龄'] > 30]:保留所有年龄大于 30 的记录行。
- df[(df['年龄'] > 25) & (df['城市'] == '上海')]:组合多个条件,注意每个条件需用括号包裹,且使用 & 而非 and。
五、常见数据处理操作
1. 新增列字段:
- df['性别'] = ['男', '女', '男']:直接赋值创建新列。
- df['年龄_明年'] = df['年龄'] + 1:基于已有列进行计算生成新列。
2. 删除行或列:
- df.drop('姓名', axis=1):删除指定列(axis=1 表示列方向)。
- df.drop(0, axis=0):删除第 0 行(axis=0 表示行方向)。
- 默认情况下该方法返回新的 DataFrame;若要就地修改原对象,添加参数 inplace=True。
3. 列名或索引重命名:
- df.rename(columns={'姓名': '名字'}, inplace=True):将“姓名”改为“名字”。
- df.rename(index={0: '第一行'}, inplace=True):修改行索引名称。
4. 数据排序功能:
- df.sort_values('年龄'):按“年龄”列升序排列。
- df.sort_values(['城市', '年龄'], ascending=[True, False]):先按城市升序,再按年龄降序排列。
5. 缺失值处理策略:
- df.isnull():生成布尔矩阵,标识 NaN 所在位置。
- df.dropna():移除含有缺失值的任意行。
- df.fillna(0):将所有 NaN 替换为 0,也可替换为均值或其他填充策略。
6. 描述性统计分析:
- df.describe():输出数值型列的基本统计信息,包括均值、标准差、分位数等。
- df['年龄'].mean():单独计算某一列的平均值。
六、高级功能简介
| 功能 | 说明 |
|---|---|
| 分组聚合 | |
| 透视表 | |
| 合并数据 | , |
| 重塑数据 | , , , |
| 时间序列 | 支持 DatetimeIndex,可用于重采样()、移动窗口计算()等操作。 |
| apply 函数 | —— 可沿行或列方向应用自定义函数。 |
七、使用建议与最佳实践
1. 避免链式赋值警告:
链式写法如 df[df>0]['A']=1 可能导致无法预期的行为。应改用以下方式:
- ? 使用 loc 显式赋值:
→ 可能无效df[df['年龄']>30]['城市'] = '深圳'
? 正确做法:.locdf.loc[df['年龄']>30, '城市'] = '深圳'
2. 复制与视图的区别:
- df2 = df:此时 df2 是 df 的视图,修改 df2 会影响原始数据 df。
df2 = df - df2 = df.copy():创建独立副本,互不影响。
df2 = df.copy()
3. 性能优化技巧:
- 避免使用 for 循环逐行处理数据,优先采用向量化运算以提升效率。
- 对于大型文件读取,建议使用分块加载机制:
chunksize
4. 内存管理方法:
- 可通过如下命令查看内存占用情况:
df.info() - 必要时调整数据类型精度以节省内存,例如将 int64 转换为 int32:
astype()
八、总结
DataFrame 是 Pandas 库的核心结构,堪称处理结构化数据的“瑞士军刀”。它结合了 Series、灵活的索引系统以及高效的向量化操作,使得数据分析过程更加简洁高效。无论是来自 CSV 文件、数据库还是 API 接口的数据,在进入分析流程前通常都会被转换为 DataFrame 格式进行处理。
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《AIGC:智能创作时代》杜雨 + 张孜铭
《Natural-Language-Processing-with-PyTorch》
《Learning OpenCV 4》
《计算机视觉-算法与应用(中文版)》
《AI 3.0》


雷达卡


京公网安备 11010802022788号







