Pandas 数据结构 – DataFrame(手把手讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在数据分析与处理领域,Pandas 是 Python 生态系统中不可或缺的工具之一。而 DataFrame 作为 Pandas 的核心数据结构,就像一座连接原始数据与分析结果的桥梁,帮助开发者高效地组织、清洗和转换数据。无论是处理表格文件、网络日志,还是构建机器学习模型,掌握 DataFrame 的操作逻辑都是入门数据分析的必经之路。本文将通过通俗易懂的比喻、代码示例与实际场景,带您系统理解 DataFrame 的核心功能与应用场景。
DataFrame 的核心概念
什么是 DataFrame?
可以将 DataFrame 想象为一个 “带标签的二维表格”。与传统的二维数组不同,DataFrame 的每一列不仅存储数据,还拥有明确的名称(列名),并且每一行都对应一个唯一的索引(行号或自定义标签)。这种结构使得数据操作更加直观:例如,你可以通过列名直接筛选销售额数据,或通过行索引快速定位某个月份的销售记录。
以下是一个 DataFrame 的简化示例:
import pandas as pd
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [28, 34, 29],
'城市': ['北京', '上海', '广州']
}
df = pd.DataFrame(data)
print(df)
输出结果:
姓名 年龄 城市
0 张三 28 北京
1 李四 34 上海
2 王五 29 广州
DataFrame 的三大核心特性
- 二维结构:类似 Excel 表格,由行和列组成。
- 异构列类型:同一 DataFrame 中的不同列可以存储不同类型的数据(如字符串、数字、日期等)。
- 标签化索引:行和列均支持自定义标签,而非仅依赖数字索引。
DataFrame 的创建方法
从字典或列表创建
DataFrame 可以通过字典、列表、CSV 文件甚至数据库查询结果生成。以下是一些常见场景:
方法 1:从字典创建
data_dict = {
'产品': ['手机', '笔记本', '耳机'],
'销量': [1200, 800, 1500],
'单价': [3000, 8000, 500]
}
df_products = pd.DataFrame(data_dict)
方法 2:从列表列表创建
data_list = [
['手机', 1200, 3000],
['笔记本', 800, 8000],
['耳机', 1500, 500]
]
df_products = pd.DataFrame(
data_list,
columns=['产品', '销量', '单价']
)
方法 3:从 CSV 文件加载
df_sales = pd.read_csv('sales_data.csv')
数据操作与处理
基础操作:查看与选择
查看数据结构
print(df.head())
print(df.info())
print(df.describe())
列的访问与筛选
column_age = df['年龄']
subset = df[['姓名', '城市']]
filtered = df[df['年龄'] > 30]
索引与定位
DataFrame 支持两种主要索引方式:
- iloc:基于整数位置的索引(类似列表)
- loc:基于标签的索引(依赖行索引名称)
print(df.iloc[0, 1]) # 输出 28
df.set_index('城市', inplace=True)
print(df.loc['北京'])
数据清洗与转换
处理缺失值
df_clean = df.dropna()
df['年龄'].fillna(df['年龄'].mean(), inplace=True)
数据类型转换
df['单价'] = df['单价'].astype(int)
列的新增与删除
df['总价'] = df['销量'] * df['单价']
df.drop(columns=['单价'], inplace=True)
高级操作:分组与聚合
按分组计算统计指标
grouped = df.groupby('城市')['销量'].sum()
自定义聚合函数
result = df.groupby('产品').agg(
平均年龄=('年龄', 'mean'),
最大销量=('销量', 'max')
)
常见问题与实战案例
案例 1:电商销售数据分析
假设我们有一个包含商品、销量、价格的 DataFrame,目标是找出最畅销且利润高的产品类别。
data = {
'产品': ['手机', '手机', '笔记本', '耳机', '耳机'],
'季度': ['Q1', 'Q2', 'Q1', 'Q2', 'Q2'],
'销量': [1200, 1500, 800, 1500, 2000],
'成本价': [2500, 2500, 7000, 400, 400],
'售价': [3000, 3000, 8000, 500, 500]
}
df = pd.DataFrame(data)
df['利润'] = (df['售价'] - df['成本价']) * df['销量']
product_profit = df.groupby('产品')['利润'].sum()
print("利润最高的产品:", product_profit.idxmax())
案例 2:处理重复数据
duplicates = df.duplicated()
df_dedup = df.drop_duplicates(keep='first')
性能优化与陷阱
避免循环遍历行
直接遍历 DataFrame 的行(如 for row in df.iterrows():
)会导致性能下降。应优先使用向量化操作:
for index, row in df.iterrows():
row['利润'] = (row['售价'] - row['成本价']) * row['销量']
df['利润'] = (df['售价'] - df['成本价']) * df['销量']
索引与内存管理
- 重置索引:
df.reset_index(drop=True)
可释放不必要的索引内存。 - 选择性加载数据:使用
usecols
参数读取 CSV 时仅加载需要的列。
结论
通过本文,我们系统梳理了 Pandas 数据结构 – DataFrame 的核心概念、创建方法、操作技巧以及常见问题解决方案。DataFrame 的灵活性与强大功能,使其成为数据处理与分析的基石。无论是处理小规模实验数据,还是构建企业级数据管道,掌握 DataFrame 的逻辑与技巧都将显著提升您的开发效率。
建议读者通过实际项目巩固所学内容,例如:
- 尝试用 DataFrame 分析本地 CSV 文件;
- 实现数据清洗、分组聚合的完整流程;
- 探索
pivot_table
、merge
等进阶功能。
数据分析之路,DataFrame 是您最得力的伙伴,而扎实的基础正是迈向更复杂任务的第一步。