目录
精通 Pandas:从理论到实践的完整指南
写在前面----为什么要写这篇博客?
小编最近在处理一个csv数据,需要用到pandas这个库,虽然之前也用过,但是都没有深入了解过,对于这个库的数据结构根本不了解,于是就想深入了解一下。只有深入了解了基本的数据结构,才能更细致的进行数据处理,于是小编本着用什么学什么的原则,整理总结了这篇博客,希望这篇博客可以帮助刚入门的同学们快速了解pandas并能够进行操作!
Pandas 是 Python 中最强大的数据分析库之一,广泛应用于数据清洗、转换和分析任务。本文将从基础理论到实际应用,带你逐步掌握 Pandas 的核心功能,结合代码示例和实战案例,帮助你快速上手并解决实际问题。
一、Pandas 简介
(一) 什么是 Pandas?
Pandas 是基于 NumPy 构建的开源库,提供了高效的数据结构和数据分析工具。其核心数据结构是 DataFrame(二维表格型数据结构)和 Series(一维数组)。Pandas 的设计目标是让数据操作像 Excel 或 SQL 表一样直观。
(二)为什么选择 Pandas?
- 灵活的数据处理:支持多种数据格式(CSV、Excel、SQL 等)。
- 高效的数据操作:提供丰富的数据清洗、筛选、聚合和转换方法。
- 与 Python 生态集成:与 NumPy、Matplotlib、Scikit-learn 等库无缝衔接。
- 社区支持:活跃的开源社区和丰富的文档资源。
二、核心数据结构
(一) Series(一维数组)
import pandas as pd
# 创建 Series
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s)
输出:
a 10
b 20
c 30
d 40
dtype: int64
特点:
- 类似于 NumPy 的一维数组,但带有标签索引(
index
)。 - 支持向量化操作(如加减乘除)。
(二)DataFrame(二维表格)
# 创建 DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'Score': [85, 90, 75]
}
df = pd.DataFrame(data)
print(df)
输出:
Name Age Score
0 Alice 25 85
1 Bob 30 90
2 Charlie 35 75
特点:
- 类似于 Excel 表格,每列可以是不同的数据类型(数值、字符串、日期等)。
- 支持行索引和列名的双重索引。
(三) 数据查看与检查总结表格
语句 | 参数说明 | 说明 | 示例 |
---|---|---|---|
df.head(n) | n :显示的行数(默认5) | 查看前 n 行数据 | df.head(3) |
df.tail(n) | n :显示的行数(默认5) | 查看后 n 行数据 | df.tail(2) |
df.info() | 无参数 | 查看数据框基本信息(列名、类型、非空值) | df.info() |
df.shape | 无参数 | 查看数据形状(行数, 列数) | print(df.shape) |
df.describe() | 无参数 | 查看数值列的统计信息(均值、标准差、极值等) | df.describe() |
df.isnull() | 无参数 | 检查缺失值(True/False) | df.isnull().sum() |
df.dtypes | 无参数 | 查看列的数据类型 | df.dtypes |
三、数据读取与写入
(一) 读取数据
Pandas 支持多种格式的数据读取,最常用的是 read_csv
:
import pandas as pd
# 读取 CSV 文件
df = pd.read_csv('data.csv')
print(df.head())
其他常见格式:
read_excel
:读取 Excel 文件。read_json
:读取 JSON 文件。read_sql
:从 SQL 数据库读取数据。
(二) 写入数据
将数据写入文件时,使用 .to_
方法:
# 写入 CSV 文件
df.to_csv('output.csv', index=False)
(三)数据读写总结表格
语句 | 参数说明 | 说明 | 示例 |
---|---|---|---|
pd.read_csv('file.csv') | file.csv :文件路径;sep :分隔符(默认逗号);header :是否读取表头(默认0) | 读取 CSV 文件 | df = pd.read_csv('data.csv', sep=';') |
df.to_csv('file.csv') | file.csv :输出路径;index :是否保存索引(默认True) | 将数据保存为 CSV 文件 | df.to_csv('output.csv', index=False) |
pd.read_excel('file.xlsx') | file.xlsx :文件路径;sheet_name :工作表名或索引(默认0) | 读取 Excel 文件 | df = pd.read_excel('data.xlsx', sheet_name='Sheet2') |
df.to_excel('file.xlsx') | file.xlsx :输出路径;sheet_name :工作表名(默认’Sheet1’) | 将数据保存为 Excel 文件 | df.to_excel('output.xlsx', sheet_name='Sales') |
pd.read_json('file.json') | file.json :文件路径;orient :JSON 格式(默认’dict’) | 读取 JSON 文件 | df = pd.read_json('data.json', orient='records') |
df.to_json('file.json') | file.json :输出路径;orient :JSON 格式(默认’dict’) | 将数据保存为 JSON 文件 | df.to_json('output.json', orient='index') |
四、数据清洗与预处理
(一)处理缺失值
# 检查缺失值
print(df.isnull().sum())
# 填充缺失值
df.fillna(0, inplace=True) # 用 0 填充
# 删除缺失值
df.dropna(inplace=True) # 删除包含缺失值的行
(二)处理重复值
# 删除重复行
df.drop_duplicates(inplace=True)
(三)数据类型转换
# 将列转换为整数类型
df['Age'] = df['Age'].astype(int)
(四)数据清洗总结表格
语句 | 参数说明 | 说明 | 示例 |
---|---|---|---|
df.dropna() | axis :轴方向(0=行,1=列);how :缺失值判断方式(‘any’=任意缺失,‘all’=全缺失) | 删除包含缺失值的行或列 | df.dropna(axis=0, how='any', inplace=True) |
df.fillna(值) | 值 :填充值;method :填充方法(‘ffill’=前向填充,‘bfill’=后向填充) | 填充缺失值 | df.fillna(0, inplace=True) |
df.drop_duplicates() | subset :去重列(默认全部列);keep :保留策略(‘first’=保留第一个,‘last’=保留最后一个) | 删除重复行 | df.drop_duplicates(subset=['Name'], keep='first', inplace=True) |
df.replace('旧值', '新值') | 旧值 :被替换值;新值 :替换值 | 替换特定值 | df['City'].replace('NYC', 'New York', inplace=True) |
df.astype(类型) | 类型 :目标数据类型(如’int’、‘float’) | 转换列的数据类型 | df['Age'] = df['Age'].astype(int) |
pd.to_datetime(列) | 列 :日期列;format :日期格式(可选) | 转换为日期时间类型 | df['Date'] = pd.to_datetime(df['Date']) |
五、数据操作与分析
(一)索引与切片
# 通过标签索引(loc)
df.loc[0, 'Name'] # 获取第一行的 'Name' 列
# 通过位置索引(iloc)
df.iloc[0, 1] # 获取第一行第二列的值
# 切片操作
df[1:3] # 获取第 2 到第 3 行
(二)条件筛选
# 筛选年龄大于 30 的记录
filtered_df = df[df['Age'] > 30]
# 多条件筛选
filtered_df = df[(df['Age'] > 30) & (df['Score'] > 80)]
(三)数据选择与筛选总结表格
语句 | 参数说明 | 说明 | 示例 |
---|---|---|---|
df['列名'] | 列名 :列标签 | 选择单列(返回 Series) | df['Age'] |
df[['列1', '列2']] | 列1 , 列2 :列标签 | 选择多列(返回 DataFrame) | df[['Name', 'Age']] |
df.loc[行标签] | 行标签 :行索引标签 | 通过标签选择行 | df.loc[0] |
df.loc[[行标签1, 行标签2]] | 行标签1 , 行标签2 :行索引标签 | 通过标签选择多行 | df.loc[[0, 1]] |
df.iloc[行索引] | 行索引 :整数位置 | 通过整数位置选择行 | df.iloc[0] |
df.iloc[起始:结束] | 起始 :起始位置;结束 :结束位置 | 通过整数位置切片 | df.iloc[0:2] |
df[条件] | 条件 :布尔表达式 | 根据条件过滤行 | df[df['Age'] > 30] |
df[(条件1) & (条件2)] | 条件1 , 条件2 :布尔表达式 | 多条件过滤 | df[(df['Age'] > 30) & (df['City'] == 'New York')] |
(四)新增与修改数据总结表格
语句 | 参数说明 | 说明 | 示例 |
---|---|---|---|
df['新列名'] = 值 | 新列名 :列标签;值 :数据 | 添加新列 | df['Total'] = df['Price'] * df['Quantity'] |
df.at[行标签, '列名'] = 值 | 行标签 :行索引;列名 :列标签 | 修改特定单元格 | df.at[0, 'Name'] = 'Alice' |
df.insert(位置, '列名', 值) | 位置 :插入位置;列名 :列标签;值 :数据 | 插入新列到指定位置 | df.insert(2, 'Gender', ['M', 'F']) |
(五)数据删除总结表格
语句 | 参数说明 | 说明 | 示例 |
---|---|---|---|
df.drop('列名', axis=1) | 列名 :列标签;axis :轴方向(1=列) | 删除列 | df.drop('Unneeded', axis=1, inplace=True) |
df.drop(行标签) | 行标签 :行索引;axis :轴方向(0=行) | 删除行 | df.drop(0, inplace=True) |
(六)数据操作(排序、分组)总结表格
语句 | 参数说明 | 说明 | 示例 |
---|---|---|---|
df.sort_values(by='列名') | by :排序列;ascending :升序(True)或降序(False) | 按列排序 | df.sort_values(by='Age', ascending=False) |
df.sort_index() | axis :轴方向(0=行,1=列);ascending :升序(True)或降序(False) | 按索引排序 | df.sort_index() |
df.groupby('列名').函数() | 列名 :分组列;as_index :是否将分组键作为索引(默认True) | 按列分组并聚合 | df.groupby('City')['Age'].mean() |
df.groupby(['列1', '列2']).函数() | 列1 , 列2 :分组列 | 多列分组 | df.groupby(['City', 'Gender'])['Salary'].sum() |
df.列名.min() / max() | 无参数 | 计算最小/最大值 | df['Age'].min() |
df.列名.mean() / median() | 无参数 | 计算均值/中位数 | df['Salary'].mean() |
(七)数据分组与聚合
# 按年龄分组并计算平均分数
grouped = df.groupby('Age')['Score'].mean()
print(grouped)
输出:
Age
25 85
30 90
35 75
Name: Score, dtype: int64
(八)数据合并与连接
# 合并两个 DataFrame
df1 = pd.DataFrame({'ID': [1, 2], 'Name': ['Alice', 'Bob']})
df2 = pd.DataFrame({'ID': [1, 2], 'Score': [85, 90]})
merged_df = pd.merge(df1, df2, on='ID')
print(merged_df)
输出:
ID Name Score
0 1 Alice 85
1 2 Bob 90
(九)数据合并与连接总计表格
语句 | 参数说明 | 说明 | 示例 |
---|---|---|---|
pd.concat([df1, df2], axis=0) | axis :拼接方向(0=行,1=列) | 沿行方向合并 DataFrame | pd.concat([df1, df2]) |
pd.merge(df1, df2, on='列名') | on :合并列;how :合并方式(‘inner’=内连,‘outer’=外连,‘left’=左连,‘right’=右连) | 按列合并(类似 SQL JOIN) | pd.merge(df1, df2, on='ID', how='inner') |
df.join(other_df, on='列名') | on :合并列;how :合并方式(默认’left’) | 按索引或列连接 DataFrame | df1.join(df2, on='Key') |
六、高级技巧
(一)数据透视表(Pivot Table)
# 创建数据透视表
pivot = pd.pivot_table(df, values='Score', index='Age', aggfunc='mean')
print(pivot)
输出:
Score
Age
25 85.0
30 90.0
35 75.0
(二)使用 query
进行复杂查询
# 筛选年龄大于 30 且分数高于 80 的记录
filtered_df = df.query("Age > 30 and Score > 80")
print(filtered_df)
(三)时间序列处理
# 创建时间序列
dates = pd.date_range('2023-01-01', periods=5)
df = pd.DataFrame({'Date': dates, 'Value': [10, 20, 30, 40, 50]})
df.set_index('Date', inplace=True)
# 按周聚合
weekly_avg = df.resample('W').mean()
print(weekly_avg)
(四)数据可视化总结表格
语句 | 参数说明 | 说明 | 示例 |
---|---|---|---|
df.plot(kind='图表类型') | kind :图表类型(‘bar’=柱状图,‘line’=折线图,‘hist’=直方图等) | 快速生成图表(需 Matplotlib) | df.plot(kind='bar', x='Name', y='Age') |
sns.函数(df) | 无参数 | 使用 Seaborn 进阶绘图 | sns.histplot(df['Age']) |
(五)高级功能 总计表格
语句 | 参数说明 | 说明 | 示例 |
---|---|---|---|
df.apply(函数) | 函数 :自定义函数;axis :轴方向(0=列,1=行) | 对行或列应用自定义函数 | df['Upper'] = df['Name'].apply(str.upper) |
df.pivot_table() | values :聚合值列;index :行分组列;columns :列分组列;aggfunc :聚合函数(如’sum’、‘mean’) | 创建透视表 | df.pivot_table(values='Sales', index='Region', columns='Year', aggfunc='sum') |
df.melt() | id_vars :保留列;value_vars :要展平的列 | 将宽表转为长表 | df.melt(id_vars='ID', value_vars=['Math', 'English']) |
七、实战案例:销售数据分析
(一)数据集描述
假设我们有一个销售数据集 sales_data.csv
,包含以下字段:
Product
:产品名称Region
:销售区域Units_Sold
:销售数量Revenue
:收入
(二)数据分析步骤
# 读取数据
df = pd.read_csv('sales_data.csv')
# 查看数据基本信息
print(df.info())
print(df.describe())
# 按区域汇总销售情况
region_sales = df.groupby('Region').agg({
'Units_Sold': 'sum',
'Revenue': 'mean'
})
print(region_sales)
# 计算每个产品的销售占比
product_sales = df.groupby('Product')['Units_Sold'].sum()
product_sales_percentage = (product_sales / product_sales.sum()) * 100
print(product_sales_percentage)
八、总结
通过本文的学习,你应该掌握了 Pandas 的核心功能,包括数据读取、清洗、操作和分析。以下是关键点总结:
- 核心数据结构:Series 和 DataFrame 是 Pandas 的基础。
- 数据清洗:处理缺失值、重复值和数据类型转换是分析的前提。
- 数据操作:索引、分组、聚合和合并是常见的操作。
- 高级技巧:数据透视表和时间序列处理能解决复杂问题。
- 实战应用:通过真实案例,你可以将理论应用到实际项目中。
九、扩展学习
- 官方文档:Pandas 官方文档
- 进阶技巧:学习
apply
、transform
和pipe
等函数。 - 可视化:结合 Matplotlib 或 Seaborn 进行数据可视化。
- 性能优化:使用 Dask 或 PySpark 处理大规模数据。
希望这篇教程能帮助你快速掌握 Pandas,并在实际项目中发挥其强大功能!