【数据处理】精通 Pandas:从理论到实践的完整指南

精通 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=列)沿行方向合并 DataFramepd.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’)按索引或列连接 DataFramedf1.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 的核心功能,包括数据读取、清洗、操作和分析。以下是关键点总结:

  1. 核心数据结构:Series 和 DataFrame 是 Pandas 的基础。
  2. 数据清洗:处理缺失值、重复值和数据类型转换是分析的前提。
  3. 数据操作:索引、分组、聚合和合并是常见的操作。
  4. 高级技巧:数据透视表和时间序列处理能解决复杂问题。
  5. 实战应用:通过真实案例,你可以将理论应用到实际项目中。

九、扩展学习

  • 官方文档Pandas 官方文档
  • 进阶技巧:学习 applytransformpipe 等函数。
  • 可视化:结合 Matplotlib 或 Seaborn 进行数据可视化。
  • 性能优化:使用 Dask 或 PySpark 处理大规模数据。

希望这篇教程能帮助你快速掌握 Pandas,并在实际项目中发挥其强大功能!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值