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 的三大核心特性

  1. 二维结构:类似 Excel 表格,由行和列组成。
  2. 异构列类型:同一 DataFrame 中的不同列可以存储不同类型的数据(如字符串、数字、日期等)。
  3. 标签化索引:行和列均支持自定义标签,而非仅依赖数字索引。

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 的逻辑与技巧都将显著提升您的开发效率。

建议读者通过实际项目巩固所学内容,例如:

  1. 尝试用 DataFrame 分析本地 CSV 文件;
  2. 实现数据清洗、分组聚合的完整流程;
  3. 探索 pivot_tablemerge 等进阶功能。

数据分析之路,DataFrame 是您最得力的伙伴,而扎实的基础正是迈向更复杂任务的第一步。

最新发布