python pandas(长文解析)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在数据分析与编程领域,"Python pandas" 是一个不可或缺的工具库。它以简洁的语法和强大的数据处理能力,成为数据科学家、工程师及开发者的首选工具。无论是处理结构化数据、清洗缺失值,还是执行复杂的数据分析,pandas 都能提供直观且高效的解决方案。本文将从基础概念入手,结合实际案例,逐步讲解 pandas 的核心功能,并帮助读者理解其背后的设计逻辑。


一、pandas 的核心数据结构:Series 与 DataFrame

pandas 的两大核心数据结构是 SeriesDataFrame。它们分别对应一维和二维数据的存储与操作,类似于 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())  

灵活的聚合功能让复杂分析变得简单。


五、合并与连接数据集

在实际项目中,数据通常分散在多个表中,需要通过 mergeconcat 合并:

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。目标是分析各产品的月度销售额。

实现步骤

  1. 读取与预处理
sales = pd.read_csv('sales.csv')  
sales['Date'] = pd.to_datetime(sales['Date'])  
  1. 按月聚合销售额
sales['Month'] = sales['Date'].dt.to_period('M')  

monthly_sales = sales.groupby(['Product', 'Month'])['Price'].sum().reset_index()  
  1. 可视化与导出结果
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 为开发者提供了从“数据输入”到“结果输出”的全流程支持。

在实际应用中,建议读者通过以下步骤深化学习:

  1. 动手实践:尝试用 pandas 解决实际项目中的问题;
  2. 探索文档:pandas 官方文档(pandas.pydata.org )是功能细节的权威来源;
  3. 结合可视化:与 matplotlib 或 seaborn 结合,提升数据表达能力。

掌握“Python pandas”不仅是技术能力的提升,更是迈向数据分析领域的关键一步。无论是处理小规模数据还是构建企业级数据管道,pandas 都能提供坚实的基础支持。

最新发布