python pandas(长文解析)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在数据分析与编程领域,"Python pandas" 是一个不可或缺的工具库。它以简洁的语法和强大的数据处理能力,成为数据科学家、工程师及开发者的首选工具。无论是处理结构化数据、清洗缺失值,还是执行复杂的数据分析,pandas 都能提供直观且高效的解决方案。本文将从基础概念入手,结合实际案例,逐步讲解 pandas 的核心功能,并帮助读者理解其背后的设计逻辑。
一、pandas 的核心数据结构:Series 与 DataFrame
pandas 的两大核心数据结构是 Series 和 DataFrame。它们分别对应一维和二维数据的存储与操作,类似于 Excel 中的“单列”与“表格”。
1. Series:单列数据的容器
Series 是一维带标签的数据结构,类似于带有索引的 Python 列表。例如:
import pandas as pd
data = pd.Series([10, 20, 30, 40], index=['A', 'B', 'C', 'D'])
print(data)
输出结果:
A 10
B 20
C 30
D 40
dtype: int64
这里,index
参数定义了每个数据点的标签(类似 Excel 的行标签),使得数据访问更直观。
2. DataFrame:表格化数据的集合
DataFrame 是二维数据结构,由多个 Series 组成,类似于 Excel 的表格。例如:
data_dict = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'London', 'Tokyo']
}
df = pd.DataFrame(data_dict)
print(df)
输出结果:
Name Age City
0 Alice 25 New York
1 Bob 30 London
2 Charlie 35 Tokyo
通过 columns
参数(可选)可以自定义列的顺序和名称。
二、数据读写与基础操作
1. 数据导入:从文件到 DataFrame
pandas 支持多种文件格式的读取,如 CSV、Excel、SQL 数据库等。以 CSV 文件为例:
df = pd.read_csv('data.csv')
print(df.head())
print(df.info())
df.head()
默认显示前 5 行,而 df.info()
会输出数据的列类型、非空值数量等关键信息。
2. 数据选择与过滤
通过列名或条件筛选数据:
ages = df['Age']
selected_rows = df[df['Age'] > 30]
类似 SQL 的 WHERE
子句,但语法更简洁。
三、数据清洗:处理缺失值与异常
1. 缺失值检测与处理
缺失值(NaN)是数据中的常见问题。pandas 提供了多种方法处理:
print(df.isnull().sum()) # 统计每列的缺失值数量
clean_df = df.dropna()
filled_df = df.fillna({'Age': 0, 'City': 'Unknown'})
比喻:缺失值就像一本破损的书,dropna()
相当于丢弃破损的页面,而 fillna()
则是尝试修补内容。
2. 数据类型转换
有时需要将某一列的数据类型从字符串转为数值:
df['Age'] = df['Age'].astype(int)
这一步骤常用于后续的数学运算或模型训练。
四、数据聚合与分组分析
1. 分组(GroupBy)与聚合
通过 groupby()
方法,可以按某一列的值分组数据,并对每组执行聚合操作:
average_age = df.groupby('City')['Age'].mean()
print(average_age)
输出示例:
City
New York 25
London 30
Tokyo 35
Name: Age, dtype: int64
比喻:分组操作就像将数据分类整理到不同的抽屉中,聚合则是对每个抽屉的内容进行统计。
2. 多条件分组与自定义函数
count_per_group = df.groupby(['City', 'Age']).size()
std_dev = df.groupby('City')['Age'].agg(lambda x: x.std())
灵活的聚合功能让复杂分析变得简单。
五、合并与连接数据集
在实际项目中,数据通常分散在多个表中,需要通过 merge
或 concat
合并:
merged_df = pd.merge(left_df, right_df, on='Key')
combined_df = pd.concat([df1, df2], axis=0)
比喻:合并操作就像用乐高积木拼接不同的模块,on
参数定义了“对接点”。
六、时间序列处理:日期与频率
1. 转换与解析日期
df['Date'] = pd.to_datetime(df['Date'])
df['Year'] = df['Date'].dt.year
2. 重采样与填充
monthly_data = df.resample('M').sum()
filled_data = df.asfreq('D', fill_value=0)
时间序列处理是金融、日志分析等场景的核心能力。
七、实战案例:电商销售数据分析
案例背景
假设我们有一个包含订单数据的 CSV 文件,字段包括 OrderID
, Customer
, Product
, Price
, Date
。目标是分析各产品的月度销售额。
实现步骤
- 读取与预处理:
sales = pd.read_csv('sales.csv')
sales['Date'] = pd.to_datetime(sales['Date'])
- 按月聚合销售额:
sales['Month'] = sales['Date'].dt.to_period('M')
monthly_sales = sales.groupby(['Product', 'Month'])['Price'].sum().reset_index()
- 可视化与导出结果:
import matplotlib.pyplot as plt
monthly_sales.pivot(index='Month', columns='Product', values='Price').plot()
plt.show()
monthly_sales.to_excel('monthly_sales_report.xlsx', index=False)
通过这一流程,用户可以快速生成专业的销售分析报告。
八、性能优化与高级技巧
1. 向量化操作替代循环
for index, row in df.iterrows():
df.at[index, 'New_Column'] = row['A'] + row['B']
df['New_Column'] = df['A'] + df['B']
向量化操作利用底层优化,速度可提升数十倍。
2. 内存优化
df['Category'] = df['Category'].astype('category')
这适用于包含重复值的字符串列,可显著减少内存占用。
结论
通过本文的讲解,读者应已掌握 pandas 的核心功能与常见用例。从基础的数据读写到复杂的数据合并、时间序列分析,pandas 为开发者提供了从“数据输入”到“结果输出”的全流程支持。
在实际应用中,建议读者通过以下步骤深化学习:
- 动手实践:尝试用 pandas 解决实际项目中的问题;
- 探索文档:pandas 官方文档(pandas.pydata.org )是功能细节的权威来源;
- 结合可视化:与 matplotlib 或 seaborn 结合,提升数据表达能力。
掌握“Python pandas”不仅是技术能力的提升,更是迈向数据分析领域的关键一步。无论是处理小规模数据还是构建企业级数据管道,pandas 都能提供坚实的基础支持。