当前位置: 首页 > news >正文

数据分析——Pandas库

Pandas是Python生态系统中最强大、最流行的数据分析库,专为处理结构化数据(如表格和时间序列)而设计。它提供了高效的数据结构和丰富的功能,使得数据清洗、转换、分析和可视化变得简单直观。

一、Pandas库的安装详解

1. 安装前的准备

在安装Pandas之前,建议先确保已安装Python环境(建议Python 3.6及以上版本)。可以通过以下命令检查Python版本:

python --version

python3 --version

2. 安装方法

方法一:使用pip安装(推荐)

这是最简单直接的安装方式:

pip install pandas

如果需要安装特定版本:

pip install pandas==1.3.5#本篇所用版本

方法二:使用conda安装(适合Anaconda用户)

conda install pandas

方法三:源码安装(适合开发者)

git clone https://github.com/pandas-dev/pandas.git
cd pandas
python setup.py install

3. 验证安装

安装完成后,可以通过以下方式验证:

import pandas as pd
print(pd.__version__)

4. 常见问题解决

安装速度慢

可以更换国内的镜像源:

pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

二、pandas的数据结构

pandas 主要提供了两种核心数据结构:

  1. Series(一维数组)

    • 类似于带标签的一维数组
    • 由两个数组组成:一个存储数据,一个存储索引(默认从0开始)
    • 示例:
      import pandas as pd
      s = pd.Series([1, 3, 5, 7], index=['a', 'b', 'c', 'd'])
      
    • 特性:
      • 支持向量化操作
      • 可以存储任意数据类型
      • 索引可以重复
  2. DataFrame(二维表格)

    • 类似于电子表格或SQL表
    • 由多个Series组成的字典结构
    • 示例:
      data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30]}
      df = pd.DataFrame(data)
      
    • 特性:
      • 行索引(index)和列索引(columns)
      • 支持列的不同数据类型
      • 提供丰富的数据操作方法

这些数据结构为数据分析提供了强大的基础,支持从数据读取、清洗到分析的全流程操作。

三、pandas数据读取与写入

读取数据

pandas提供了多种方法来读取不同格式的数据文件:

1. 读取CSV文件

import pandas as pd# 基本读取
df = pd.read_csv('data.csv')# 带参数读取
df = pd.read_csv('data.csv', encoding='utf-8',header=0,  # 指定表头行index_col=0,  # 指定索引列na_values=['NA', 'N/A'])  # 指定缺失值标识

2. 读取Excel文件

# 读取单个sheet
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')# 读取整个Excel文件的所有sheet
excel_file = pd.ExcelFile('data.xlsx')
df1 = excel_file.parse('Sheet1')
df2 = excel_file.parse('Sheet2')

3. 读取JSON文件

df = pd.read_json('data.json', orient='records')

4. 读取SQL数据库

from sqlalchemy import create_engine# 创建数据库连接
engine = create_engine('sqlite:///database.db')# 读取数据
df = pd.read_sql('SELECT * FROM table_name', con=engine)

写入数据

pandas同样支持多种数据格式的输出:

1. 写入CSV文件

df.to_csv('output.csv',index=False,  # 不写入索引encoding='utf-8',columns=['col1', 'col2'])  # 指定写入的列

2. 写入Excel文件

# 写入单个sheet
df.to_excel('output.xlsx', sheet_name='Data')# 写入多个sheet
with pd.ExcelWriter('output.xlsx') as writer:df1.to_excel(writer, sheet_name='Sheet1')df2.to_excel(writer, sheet_name='Sheet2')

3. 写入JSON文件

df.to_json('output.json', orient='records')

4. 写入SQL数据库

# 写入新表
df.to_sql('new_table', con=engine, if_exists='fail')# 追加到现有表
df.to_sql('existing_table', con=engine, if_exists='append')

其他实用功能

1. 处理大文件

对于大文件可以使用分块读取:

chunk_size = 10000
chunks = pd.read_csv('large_file.csv', chunksize=chunk_size)for chunk in chunks:# 处理每个数据块process(chunk)

2. 数据类型指定

dtypes = {'col1': 'int32', 'col2': 'category'}
df = pd.read_csv('data.csv', dtype=dtypes)

3. 日期解析

df = pd.read_csv('data.csv', parse_dates=['date_column'])

四、pandas数据查看与检查

head()和tail()方法

  • df.head(n):查看DataFrame的前n行,默认显示前5行
    df.head(10)  # 查看前10行数据
    
  • df.tail(n):查看DataFrame的后n行,默认显示后5行
    df.tail(3)  # 查看最后3行数据
    

数据概览

  • df.shape:查看DataFrame的形状(行数,列数)
    print(df.shape)  # 输出类似(1000, 15)表示1000行15列
    
  • df.info():查看数据集的整体信息
    • 显示每列的非空值数量
    • 每列的数据类型
    • 内存使用情况
    df.info()  # 输出各列详细信息
    

数据统计信息检查

describe()方法

  • df.describe():生成描述性统计信息
    • 数值型列:计数、均值、标准差、最小值、四分位数、最大值
    • 非数值型列:计数、唯一值数量、频数最高的值及其出现次数
    df.describe(include='all')  # 包含所有列
    df.describe(include=['float64'])  # 只包含浮点数列
    

唯一值和频率统计

  • df.nunique():查看每列的唯一值数量
    df.nunique()  # 各列唯一值数量
    
  • df.value_counts():查看某列的值分布
    df['gender'].value_counts(normalize=True)  # 显示比例而非计数
    

数据类型和缺失值检查

数据类型检查

  • df.dtypes:查看各列的数据类型
    print(df.dtypes)  # 输出各列数据类型
    
  • 类型转换示例:
    df['date'] = pd.to_datetime(df['date'])  # 转换为日期类型
    df['price'] = df['price'].astype(float)  # 转换为浮点数
    

缺失值检查

  • df.isnull():返回布尔矩阵,显示每个元素是否为缺失值
    df.isnull().sum()  # 统计每列缺失值数量
    
  • 缺失值可视化:
    import matplotlib.pyplot as plt
    import seaborn as snssns.heatmap(df.isnull(), cbar=False)
    plt.show()
    

更高级的数据检查方法

数据抽样

  • df.sample():随机抽样查看数据
    df.sample(5)  # 随机查看5行
    df.sample(frac=0.1)  # 抽取10%的数据
    

条件筛选检查

  • 使用布尔索引筛选特定数据
    # 查看年龄大于30的记录
    df[df['age'] > 30]# 查看特定城市和性别的记录
    df[(df['city'] == 'Beijing') & (df['gender'] == 'Female')]
    

重复值检查

  • df.duplicated():检查重复行
    df.duplicated().sum()  # 统计重复行数
    df[df.duplicated()]  # 查看重复行
    
  • 特定列重复检查:
    df.duplicated(subset=['id', 'date']).sum()  # 检查ID和日期组合是否重复
    

五、pandas数据选择与过滤

1. 列选择
列选择是最基础的数据操作之一,通过列名来获取指定列的数据。

### 单列选择
```python
df['Name']  # 返回Name列的所有数据,返回类型为Series

多列选择

df[['Name', 'Age']]  # 返回包含Name和Age两列的数据,返回类型为DataFrame

应用场景:当只需要分析特定几列数据时使用,例如只需要查看客户的姓名和年龄信息。

2. 行选择

行选择可以通过标签或位置索引来获取数据。

按标签选择行(loc)

df.loc[0]        # 返回索引标签为0的行数据
df.loc[0:2]      # 返回索引标签从0到2的行数据(包含2)

按位置选择行(iloc)

df.iloc[0]       # 返回第一行数据(位置索引从0开始)
df.iloc[0:3]     # 返回第1到第3行数据(不包含3)

注意事项

  • loc是基于标签的索引,包含结束位置
  • iloc是基于位置的索引,不包含结束位置

3. 条件过滤

条件过滤可以根据特定条件筛选出符合要求的数据行。

简单条件过滤

df[df['Age'] > 30]  # 筛选出年龄大于30岁的所有记录

多条件组合过滤

df[(df['Age'] > 25) & (df['City'] == 'NY')]  # 筛选年龄大于25岁且居住在NY的记录

示例说明:假设我们有一个客户数据集,包含Name、Age、City等字段。使用多条件过滤可以快速找到特定城市的特定年龄段客户。

运算符说明

  • & 表示逻辑与
  • | 表示逻辑或
  • ~ 表示逻辑非

注意:多个条件必须用括号括起来,否则会报错。

六、数据处理

1. 缺失值处理

缺失值是数据分析中常见的问题,pandas提供了多种处理方式:

删除缺失值

df.dropna()  # 默认删除包含任何缺失值的整行
df.dropna(axis=1)  # 删除包含缺失值的列
df.dropna(thresh=3)  # 只保留至少有3个非缺失值的行

填充缺失值

df.fillna(0)  # 用0填充所有缺失值
df.fillna({'Salary': df['Salary'].mean(), 'Age': 30})  # 对不同列使用不同填充值
df.fillna(method='ffill')  # 用前一个有效值向前填充

缺失值检测

df.isnull()  # 返回布尔DataFrame,显示每个位置是否为缺失值
df.isnull().sum()  # 计算每列的缺失值数量
df[df['Age'].isnull()]  # 筛选出Age列为缺失值的行

2. 重复值处理

重复数据会影响分析结果,常见的处理方法包括:

df.drop_duplicates()  # 删除完全相同的行
df.drop_duplicates(subset=['Name', 'Phone'])  # 基于指定列判断重复
df.drop_duplicates(keep='last')  # 保留最后一次出现的重复行
df.drop_duplicates(keep=False)  # 删除所有重复行

3. 数据排序

数据排序有助于发现模式和异常值:

df.sort_values('Age')  # 按年龄升序排序
df.sort_values('Age', ascending=False)  # 按年龄降序排序
df.sort_values(['Department', 'Salary'], ascending=[True, False])  # 多列排序
df.sort_index()  # 按索引排序

4. 数据分组

分组是数据分析的核心操作,可用于计算各种统计量:

# 基本分组
df.groupby('City')['Age'].mean()  # 按城市分组计算平均年龄# 多重分组
df.groupby(['City', 'Gender'])['Income'].median()  # 按城市和性别分组计算收入中位数# 多聚合函数
df.groupby('Department').agg({'Salary': ['mean', 'max', 'min'],'Age': 'median'
})# 分组后应用自定义函数
def top_earners(group):return group.nlargest(3, 'Salary')df.groupby('Department').apply(top_earners)

    七、数据转换

    1.添加新列 通过布尔条件创建新列是数据预处理中的常见操作:

    df['Senior'] = df['Age'] > 30  # 添加布尔列,标记年龄大于30岁的员工
    

    示例应用场景:在人力资源数据分析中,可以用此方法快速区分资深员工和普通员工,便于后续分组分析。

    2.应用函数 使用apply方法可以对列数据进行函数处理:

    df['Name_Length'] = df['Name'].apply(len)  # 计算每个姓名的字符长度
    df['Salary_Adjusted'] = df['Salary'].apply(lambda x: x*1.1)  # 工资上调10%
    

    最佳实践:当需要执行复杂转换时,可以定义单独的函数然后传入apply,提高代码可读性3

    3.数据合并 Pandas提供多种数据合并方式: 纵向合并(堆叠):

    pd.concat([df1, df2], axis=0)  # 默认纵向合并,相同结构的两个表格上下拼接
    pd.concat([df1, df2], ignore_index=True)  # 重建索引
    

    横向合并(连接):

    # 内连接,基于共同键值合并
    pd.merge(df1, df2, on='employee_id', how='inner')# 左连接,保留左边表的所有记录
    pd.merge(df1, df2, on='department', how='left')# 外连接,保留所有记录
    pd.merge(df1, df2, on='project_id', how='outer')
    

    合并操作常用于:将分散在不同表中的相关数据整合到一起,比如将员工信息表与部门信息表合并。

    http://www.dtcms.com/a/319083.html

    相关文章:

  1. 添加内容溢出时显示完整内容提示的功能
  2. QT5.15 mingw
  3. c++之 栈浅析
  4. Python 数据类型及数据类型转换
  5. platform总线简介和使用场景说明
  6. 基于Ruby的IP池系统构建分布式爬虫架构
  7. 《算法导论》第 9 章 - 中位数和顺序统计量
  8. 网页图片视频一键下载+视频去重修改 ,覆盖B站等多个平台
  9. 【基础知识】springboot+vue 基础框架搭建(更新中)
  10. 中国MCP市场:腾讯、阿里、百度的本土化实践
  11. AI绘画:生成唐初李世民全身像提示词
  12. 前后端加密传数据实现方案
  13. 强反光干扰下读数误差↓79%!陌讯多模态算法在仪表盘识别场景的落地优化​
  14. LINUX-文件查看技巧,重定向以及内容追加,man及echo的使用
  15. 迅为RK3588开发板Android proc文件系统查询-内核版本查询
  16. PyTorch RNN 名字分类器
  17. 11-netty基础-手写rpc-支持多序列化协议-03
  18. 【MySQL基础篇】:MySQL事务并发控制原理-MVCC机制解析
  19. qt的元对象系统详解
  20. 2深度学习Pytorch-神经网络--全连接神经网络、数据准备(构建数据类Dataset、TensorDataset 和数据加载器DataLoader)
  21. Activiti 中各种 startProcessInstance 接口之间的区别
  22. [激光原理与应用-169]:测量仪器 - 皮秒激光器研发过程中所需要的测量仪器
  23. 2025年机械工程与自动化技术国际会议(ICMEAT 2025)
  24. 力扣 hot100 Day68
  25. 主流小程序 SaaS 平台测评,2025年小程序开发避坑指南
  26. 移动端录屏需求调研:以小熊录屏为例的轻量级实现方案
  27. .NET9 AOT完全自举了吗?
  28. 面向对象之类方法,成员变量和局部变量
  29. 【前端八股文面试题】JavaScript中的数据类型?存储上的差别?
  30. react_05create-react-app脚手架详细解析(export)