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)
      • 支持列的不同数据类型
      • 提供丰富的数据操作方法

适用场景​

​​Series​

​​DataFrame​

  • ​单变量分析​​:如时间序列数据(股价、温度记录)。

  • ​简单统计​​:计算均值、最大值等基础统计量。

  • ​作为DataFrame组件​​:DataFrame的列本质上是Series。

  • ​结构化数据分析​​:如CSV文件、SQL表、Excel表格。

  • ​复杂操作​​:数据清洗(去重、填充缺失值)、分组聚合(groupby)、透视表。

  • ​机器学习​​:特征工程、数据预处理(如标准化、编码)。

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

三、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. 列选择
列选择是最基础的数据操作之一,通过列名来获取指定列的数据。

单列选择

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. 条件过滤

pandas 提供了强大的布尔索引(Boolean Indexing)功能,可以根据条件表达式筛选 DataFrame 或 Series 中的数据。这种过滤方式非常灵活高效,是数据清洗和预处理中的常用操作。

test = pd.DataFrame({1:[1,2,3],2:[4,5,6],3:[7,8,9],4:[10,11,12],5:[13,14,15]})
print(test[[True,False,False]])#输出布尔值为Ture的行。结果为1,4,7,10,13

简单条件过滤

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.pswp.cn/news/918095.shtml
    繁体地址,请注明出处:http://hk.pswp.cn/news/918095.shtml
    英文地址,请注明出处:http://en.pswp.cn/news/918095.shtml

    如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    数据结构-哈希表(散列表)

    1.基本概念哈希表(散列表):提高数据的查找效率哈希存储:将要存储的数据的关键字和存储位置之间,建立起对应的关系, 这个关系称之为哈希函数。存储数据时,通过对应的哈希函数可以将数据映射到指定…

    如何在Vue中使用拓扑图功能

    前言 该组件基于 Vue.js 和 AntV G6 构建项目特色功能 1. 丰富的节点图标支持 本拓扑图系统的最大特色是支持使用自定义图片作为节点图标 2. 智能的力导向布局 系统采用力导向布局算法,能够自动优化节点位置,避免重叠,形成美观的网络拓扑结构…

    基于dynamic的Druid 与 HikariCP 连接池集成配置区别

    你提供的内容是关于 ​​dynamic-datasource-spring-boot-starter​​ 的详细介绍,这是一个非常实用的 ​​Spring Boot 多数据源动态切换组件​​,适用于需要在单个应用中连接多个数据库并灵活切换数据源的场景。下面我为你梳理一下该组件的核心信息与使…

    算法训练之栈

    ♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…

    OpenAI 最新开源模型 gpt-oss (Windows + Ollama/ubuntu)本地部署详细教程

    OpenAI 最近发布了其首个开源的开放权重模型gpt-oss,这在AI圈引起了巨大的轰动。对于广大开发者和AI爱好者来说,这意味着我们终于可以在自己的机器上,完全本地化地运行和探索这款强大的模型了。 本教程将一步一步指导你如何在Windows系统上&…

    在X86架构Linux中创建虚拟根目录并下载指定架构(如aarch64)的软件包(含依赖)

    在X86架构Linux中创建虚拟根目录并下载指定架构(如aarch64)的软件包(含依赖) 在Linux系统中,有时候我们需要在特定的环境或架构下安装软件包,而不影响主系统。一种常见的方法是创建一个虚拟的根目录,并在此环境中操作。本文将介绍如何通过创建…

    scratch笔记和练习-第9课:一起来绘画

    位图也称为点阵图,它是由许许多多的点组成的,这些点被称为像素。位图图像可以表现丰富的多彩变化 并产生逼真的效果,很容易在不同软件之间交换使用, 但它在保存图像时需要记录每一个像素的色彩信息,所以占用的存储空间…

    [linux] Linux:一条指令更新DDNS

    Linux:一条指令更新DDNS 在动态IP环境下,如何确保我们的域名始终指向正确的公网IP地址?动态DNS(DDNS)服务为我们提供了完美的解决方案。今天,我将分享一个简洁高效的Linux命令行指令,用于自动更…

    [激光原理与应用-182]:测量仪器 - 光束型 - 光束质量分析仪

    光束质量分析仪是用于精确评估激光光束特性的核心设备,通过测量光束的强度分布、相位分布、发散角等参数,为激光系统的优化、加工工艺控制及科研实验提供关键数据支持。以下是光束质量分析仪的详细解析:一、核心功能 - 光束强度分布分析测量内…

    Linux 限制 root 登录 IP 地址的方法

    Linux 限制 root 登录 IP 地址的方法Linux 限制 root 登录 IP 地址的方法方法一:修改 SSH 配置文件方法二:使用 hosts.allow 和 hosts.deny 文件方法三:使用防火墙规则方法四:使用 access.conf 文件注意事项Linux 限制 root 登录 …

    Word中怎样插入特殊符号

    使用 “插入” 菜单:插入常用符号:将光标置于要插入符号的位置,点击 “插入” 选项卡,在 “符号” 组中点击 “符号” 按钮,会弹出一个符号库,里面包含了常见的标点符号、特殊字符等,找到所需符…

    Linux 内核发包流程与路由控制实战

    Linux 内核发包流程与路由控制实战 在网络调优、性能优化、SDN、NFV、容器网络等场景下,理解 Linux 内核发包路径和路由控制机制是必修课。 本文将从内核网络栈的原理入手,再结合 iproute2 命令和 策略路由给出实战案例。一、Linux 内核发包流程&#xf…

    点播服务器

    早期的时候,用 live555 作为 rtsp 点播服务器;现在比较常用的 流媒体服务器比较多;这里比较简单的,可以用 ZLMediakit;可以支持 ffmeg 退流 到ZLMediakit,然后别的客户端从 ZLMediakit 服务器拉流&#xff…

    分享超图提供的、很不错的WebGIS学习资源

    最近在学习了解Supermap iclient,发现官方提供的帮助文档、GIS学堂真的不错,解释了很多的内容。 官方modern-web-gis-in-action文档的网址如下:https://iclient.supermap.io/web/books/modern-web-gis-in-action/,在其中介绍了现代…

    通信算法之298: verilog语法generate和for介绍

    在 Verilog 中,generate和for是实现参数化设计和模块实例化复用的重要工具,尤其在需要根据参数动态生成逻辑时非常有用。以下是它们的使用方法和区别:1. for循环(过程块内)for循环主要用于过程块(always/in…

    laravel在cli模式下输出格式漂亮一些

    在 Laravel 的 CLI 模式下,可以通过以下方式让命令行输出更加美观和专业: 1. 使用 Artisan 输出助手方法 Laravel 提供了多种输出样式方法: public function handle() {// 基础样式$this->info(成功信息 - 绿色); // 绿色$this->err…

    大数据管理与应用学什么?就业前景怎么样?

    前言在数字经济蓬勃发展的今天,大数据已经成为推动社会进步的核心生产要素。大数据管理与应用作为新兴交叉学科,正受到越来越多学生和企业的关注。本文将全面剖析该专业的课程体系、核心技能要求,详细介绍CDA数据分析师认证的备考策略&#x…

    mac笔记本如何重新设置ssh key

    要在Mac上重新生成SSH密钥并将其添加到平台,可以按照以下步骤操作: 打开终端 在Mac上,你可以通过Spotlight搜索(按Command Space)输入Terminal来打开终端或者直接搜索终端检查现有SSH密钥 首先,检查是否已…

    Godot ------ 通过鼠标对节点进行操作

    Godot ------ 通过鼠标对节点进行操作 引言 正文 引言 对于一个游戏,通过鼠标对游戏对象进行操作是非常普遍的行为,本文我们将以 Control 节点进行举例,说明如何通过鼠标对 Control 节点进行移动操作。 正文 首先,我们创建一个 Contorl 节点,并将它的 Layout->Trans…

    k8s 网络插件 flannel calico

    一、k8s 网络概述 Kubernetes网络是指在Kubernetes集群中不同组件之间进行通信和交互的网络架构,每个容器都有自己的IP地址,这些容器组成了Pod,Pod是Kubernetes调度的最小单元。 Pod是Kubernetes中最小的部署单元,每个Pod都有一个…