Python编程进阶知识之第四课处理数据(pandas)

目录

简介

1. 安装 Pandas

2.基本数据结构

1.Series

(1.)创建Series

 (2.)Series的属性

 (3.)Series 的索引和切片

2.DataFrame

(1.)创建 DataFrame

 (2.)DataFrame 的属性

  (3.)DataFrame 的排序和值替换

 3.pandas的选取与修改

4.pandas的索引

1. 标签索引(.loc)

2. 位置索引(.iloc)

5. Pandas 的条件筛选 

6. Pandas 中处理重复值

7. Pandas 中处理缺失值


简介

        在当今这个数据爆炸的时代,数据处理已经成为了各个领域中不可或缺的一环。无论是数据分析、机器学习还是人工智能,都需要对大量的数据进行清洗、转换和分析。而 Pandas 作为 Python 中最流行的数据处理库之一,凭借其强大的功能和简洁的 API,成为了数据科学家们的首选工具。无论你是数据科学的新手还是有一定经验的从业者,都能从本文中获得有价值的信息。

        这篇文章并没有把pandas所有内容说完,但是为后面机器学习、深度学习已经足够使用了,学习太多容易混乱

1. 安装 Pandas

        Pandas 是一个开源的 Python 库,专为数据处理和分析而设计。它提供了高性能、易用的数据结构和数据分析工具,使数据处理变得更加简单和高效。Pandas 的主要数据结构是 Series(一维数组)和 DataFrame(二维表格),它们提供了强大的索引功能和数据操作能力。

        安装 Pandas 非常简单,只需要使用 pip 命令即可:

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

2.基本数据结构

        Pandas 有两种主要的数据结构:Series 和 DataFrame。

1.Series

(1.)创建Series

        Series 是一个一维的带标签数组,可以容纳任何数据类型(整数、字符串、浮点数、Python 对象等)。它由两部分组成:索引(index)和值(values)。

import pandas as pd# 创建一个Series
s_1 = pd.Series([1, 2, 3, 4, 5])
print(s_1)# 创建自定义索引的 Series
s_2 = pd.Series([1, 2, 3, 4, 5],index=['a', 'b', 'c', 'd', 'e'])
print(s_2)#创建字符串类型的 Series
s_3 = pd.Series(['Lily', "Rose", "Jack"])
print(s_3)

输出结果:

#s_1
0    1
1    2
2    3
3    4
4    5
dtype: int64
#s_2
a    1
b    2
c    3
d    4
e    5
dtype: int64
#s_3
0    Lily
1    Rose
2    Jack
dtype: object

 (2.)Series的属性

  • .index:获取索引对象
  • .values:获取底层 NumPy 数组
print(s_1.index)
print(s_2.index)
print(s_1.values)
print(s_3.values)
# 运行结果:RangeIndex(start=0, stop=5, step=1)
# Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
# [1 2 3 4 5]
# ['Lily' 'Rose' 'Jack']

 (3.)Series 的索引和切片

创建 Series 对象

import pandas as pds_1 = pd.Series([1, 2, 3, 4, 5],index=['a', 'b', 'c', 'd', 'e'])s_2 = pd.Series(['lily', 'rose', 'jack'])
# a    1
# b    2
# c    3
# d    4
# e    5
# dtype: int64# 0    lily
# 1    rose
# 2    jack
# dtype: object

基于标签的索引(自定义索引)

# 访问单个元素(标签索引)
print(s_1['d'])  # 输出:4# 访问多个元素(标签切片)
# print(s_1['a':'d'])  # 输出:a到d的元素(含d)# 访问不连续的元素
print(s_1[['a', 'd']])  # 输出:a和d的元素

 基于位置的索引(默认索引)

print(s_2[2])       # 输出:jack(位置2的元素)
print(s_2[0:2])     # 输出:位置0和1的元素(不含2)
print(s_2[[0, 2]])  # 输出:位置0和2的元素

 混合索引的注意事项

print(s_1[4])  # 输出:5(位置4的元素,即索引'e'对应的值)
  • 当自定义索引是标签时,s_1[4]会被解释为位置索引
  • 但这种用法容易混淆,建议明确使用.loc(标签)或.iloc(位置)

2.DataFrame

        DataFrame 是一个二维的带标签数据结构,类似于 Excel 表格或 SQL 表。它可以被看作是由多个 Series 组成的字典,每个 Series 共享相同的索引。

(1.)创建 DataFrame

创建带自定义索引的 DataFrame

df_1 = pd.DataFrame({'age': [10, 11, 12],'name': ['tim', 'tom', 'rose'],'income': [100, 200, 300]},index=['person1', 'person2', 'person3'])
print(df_1)
  • 使用字典创建 DataFrame,键为列名,值为列数据
  • 通过index参数指定行索引
          age  name  income
person1   10   tim    100
person2   11   tom    200
person3   12  rose    300

 创建带默认索引的 DataFrame

df_1 = pd.DataFrame({'age': [10, 11, 12],'name': ['tim', 'tom', 'rose'],'income': [100, 200, 300]})
print(df_1)
  • 不指定索引时,默认生成整数索引(0 到 2)
   age  name  income
0   10   tim    100
1   11   tom    200
2   12  rose    300

 (2.)DataFrame 的属性

# 行索引
df_1.index  # 输出:Index(['person1', 'person2', 'person3'], dtype='object')# 列名
df_1.columns  # 输出:Index(['age', 'name', 'income'], dtype='object')# 值(NumPy数组)
df_1.values  # 输出:
# array([[10, 'tim', 100],
#        [11, 'tom', 200],
#        [12, 'rose', 300]], dtype=object)

访问DataFrame 的列(Series)

print(df_1.name)
  • 通过属性访问name列,返回 Series 对象
  • 输出结果:
0     tim
1     tom
2    rose
Name: name, dtype: object

  (3.)DataFrame 的排序和值替换

创建 DataFrame

dic = {'name': ['kiti', 'beta', 'peter', 'tom'],'age': [20, 18, 35, 21],'gender': ['f', 'f', 'm', 'm']}
df = pd.DataFrame(dic)
print(df)
  • 使用字典创建 DataFrame,默认索引为 0 到 3
   name  age gender
0  kiti   20      f
1  beta   18      f
2 peter   35      m
3   tom   21      m

按照年龄列排序

# 升序排序(默认)
df = df.sort_values(by=['age'])# 降序排序
df = df.sort_values(by=['age'], ascending=False)
  • 最终结果(降序):
   name  age gender
2 peter   35      m
3   tom   21      m
0  kiti   20      f
1  beta   18      f

值替换

df['gender'] = df['gender'].replace(['m', 'f'], ['male', 'female'])
  • replace()方法替换 Series 中的值
  • ['m', 'f']:要替换的值
  • ['male', 'female']:替换后的值
   name  age  gender
2 peter   35    male
3   tom   21    male
0  kiti   20  female
1  beta   18  female

 3.pandas的选取与修改

创建 DataFrame

df = pd.DataFrame({'age': [10, 11, 12],'name': ['tim', 'tom', 'rose'],'income': [100, 200, 300]},index=['person1', 'person2', 'person3'])
          age  name  income
person1   10   tim    100
person2   11   tom    200
person3   12  rose    300

 添加列

df['pay'] = [20, 30, 40]
  • 在末尾添加pay
          age  name  income  pay
person1   10   tim    100    20
person2   11   tom    200    30
person3   12  rose    300    40

 添加行

df.loc['person4', ['age', 'name', 'income']] = [20, 'kitty', 200]
  • 使用.locperson4位置添加新行
          age   name  income  pay
person1   10    tim    100    20
person2   11    tom    200    30
person3   12   rose    300    40
person4   20  kitty    200   NaN

 数据访问

# 访问列
print(df.name)        # 通过属性访问# 访问多列
print(df[['age', 'name']])# 访问行(位置切片)
print(df[0:2])        # 位置0到1(不含2)# 访问行(标签索引)
print(df.loc[['person1', 'person3']])# 访问单个值
print(df.loc['person1', 'name'])  # 输出:tim

 删除操作

# 直接删除列(原地操作)
del df['age']# 删除列(返回新DataFrame)
data = df.drop('name', axis=1, inplace=False)# 删除行(原地操作)
df.drop('person3', axis=0, inplace=True)

 时间序列 DataFrame

datas = pd.date_range('20180101', periods=5)
df1 = pd.DataFrame(np.arange(30).reshape(5, 6), index=datas, columns=['A', 'B', 'C', 'D', 'E', 'F'])
                   A   B   C   D   E   F
2018-01-01         0   1   2   3   4   5
2018-01-02         6   7   8   9  10  11
2018-01-03        12  13  14  15  16  17
2018-01-04        18  19  20  21  22  23
2018-01-05        24  25  26  27  28  29

4.pandas的索引

创建 DataFrame

df = pd.DataFrame(np.arange(30).reshape(5, 6),index=['20180101', '20180102', '20180103', '20180104', '20180105'],columns=['A', 'B', 'C', 'D', 'E', 'F']
)
  • 使用 NumPy 数组创建 DataFrame
  • 行索引为日期字符串,列索引为字母
            A   B   C   D   E   F
20180101    0   1   2   3   4   5
20180102    6   7   8   9  10  11
20180103   12  13  14  15  16  17
20180104   18  19  20  21  22  23
20180105   24  25  26  27  28  29

1. 标签索引(.loc

# 获取某列(全部行的B列)
print(df.loc[:, 'B'])
# 输出:
# 20180101     1
# 20180102     7
# 20180103    13
# 20180104    19
# 20180105    25
# Name: B, dtype: int64# 获取单个值(20180103行的B列)
print(df.loc['20180103', 'B'])  # 输出:13# 获取某行的多列(20180103行的B列和D列)
print(df.loc['20180103', ['B', 'D']])
# 输出:
# B    13
# D    15
# Name: 20180103, dtype: int64# 获取整行(20180101行的所有列)
print(df.loc['20180101', :])
# 输出:
# A    0
# B    1
# C    2
# D    3
# E    4
# F    5
# Name: 20180101, dtype: int64

2. 位置索引(.iloc

# 获取单个值(第2行第3列,索引从0开始)
print(df.iloc[1, 2])  # 输出:8# 获取某列(所有行的第3列)
print(df.iloc[:, 2])
# 输出:
# 20180101     2
# 20180102     8
# 20180103    14
# 20180104    20
# 20180105    26
# Name: C, dtype: int64# 获取整行(第2行的所有列)
print(df.iloc[1, :])
# 输出:
# A     6
# B     7
# C     8
# D     9
# E    10
# F    11
# Name: 20180102, dtype: int64

5. Pandas 的条件筛选 

读取数据

df = pd.read_csv("data2.csv", encoding='gbk', engine='python')

 数值条件筛选

# 筛选好评数>17000的记录
df_1 = df[df['好评数'] > 17000]# 筛选好评数在15000-17000之间的记录
df_2 = df[df['好评数'].between(15000, 17000)]
  • df['好评数'] > 17000:生成布尔 Series
  • between(a, b):等效于(x >= a) & (x <= b)

 字符串条件筛选

# 筛选品牌包含"苹果"且非空的记录
df_3 = df[df['品牌'].str.contains('苹果', na=False)]# 筛选品牌包含"苹果"或为空值的记录
df_4 = df[df['品牌'].str.contains('苹果', na=True)]
  • str.contains('苹果'):判断字符串是否包含子串
  • na=False:将 NaN 视为 False(排除空值)
  • na=True:将 NaN 视为 True(包含空值)

 多条件组合筛选

# 筛选价格<7000且好评数>16000的记录
df_5 = df[(df['价格'] < 7000) & (df['好评数'] > 16000)]# 筛选价格<6000或好评数>18000的记录
df_6 = df[(df['价格'] < 6000) | (df['好评数'] > 18000)]
  • 使用&(逻辑与)和|(逻辑或)组合条件
  • 每个条件必须用括号()包裹
  • 最终结果df_6包含所有满足任一条件的记录

6. Pandas 中处理重复值

读取数据

df = pd.read_csv(r"data1.csv", encoding='gbk', engine='python')

​​​​​​判断重复值

# 判断全量重复行(所有列值相同)
result1 = df.duplicated()# 判断基于单列的重复行
result2 = df.duplicated('gender')# 判断基于多列组合的重复行
result3 = df.duplicated(['gender', 'name'])
  • duplicated()返回布尔 Series,标记每行是否为重复行
  • keep='first'(默认):首次出现的行标记为 False,后续重复行标记为 True
  • 多列判断时,只有所有指定列的值都相同才算重复

 提取重复行

a = df[result1]  # 全量重复行
b = df[result2]  # gender列重复的行
c = df[result3]  # gender和name都重复的行# 手动布尔索引(示例)
d = df[[True, False, False, True, True, False, False]]
  • 通过布尔索引提取对应行
  • 手动指定布尔列表时,长度必须与 DataFrame 行数一致

 删除重复行

# 删除全量重复行(保留首次出现的行)
new_df1 = df.drop_duplicates()# 删除基于多列组合的重复行
new_df2 = df.drop_duplicates(['name', 'gender'])

7. Pandas 中处理缺失值

读取数据

df = pd.read_csv(r"data.csv", encoding='gbk', engine='python')

 

 检测缺失值

na = df.isnull()
  • isnull()返回布尔 DataFrame
  • 每个元素标记是否为缺失值(NaNNone

 

    填充缺失值

    df1 = df.fillna('1')
    • fillna('1'):用字符串'1'填充所有缺失值
    • 其他常用填充方式:
    df.fillna(0)                 # 用0填充
    df.fillna(method='ffill')    # 用前一个有效值填充
    df.fillna({'col1': 0, 'col2': 100})  # 按列指定填充值

     删除缺失值

    df2 = df.dropna()
    • dropna()默认删除包含任何缺失值的行
    • 参数说明
    df.dropna(axis=0)       # 删除行(默认)
    df.dropna(axis=1)       # 删除列
    df.dropna(how='all')    # 只删除全为缺失值的行
    df.dropna(thresh=2)     # 保留至少有2个非缺失值的行

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如若转载,请注明出处:http://www.pswp.cn/diannao/92717.shtml
    繁体地址,请注明出处:http://hk.pswp.cn/diannao/92717.shtml

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

    相关文章

    使用 Vue 实现移动端视频录制与自动截图功能

    文章目录技术栈功能介绍video标签属性完整代码js 前端实现将视频Blob转Base64java 后端实现将视频Base64转mp4文件在移动端网页开发中&#xff0c;使用摄像头录制视频并自动生成截图是一个常见的需求&#xff0c;比如身份认证、人脸识别或互动问卷等场景。本文将介绍如何使用 V…

    单片机是怎么控制步进电机的?

    步进电机作为一种将电脉冲信号转化为角位移的执行机构&#xff0c;其运转依赖于脉冲信号的控制&#xff0c;而单片机作为控制核心&#xff0c;通过输出特定的脉冲信号和方向信号&#xff0c;实现对步进电机的步数、方向、转速的精准控制&#xff0c;整个过程需结合驱动电路、程…

    数据库binlog日志查看方案

    binlog可以查看当前数据库中所有的修改操作&#xff0c;包含数据和结构的修改&#xff0c;所以掌握数据库日志查看是有必要的 通过客户端连接到mysql 查看binlog日志的存储位置&#xff08;前提是已开启binlog&#xff09; -- 查看日志文件列表 SHOW BINARY LOGS;结果示例-- 这…

    MinIO Go 客户端使用详解:对象存储开发实战指南

    MinIO GO-SDK ✅ 一、准备工作 1. 环境依赖 2. 安装 SDK 🔧 二、初始化 MinIO 客户端 📦 三、创建 Bucket(存储桶) ⬆️ 四、上传对象 ⬇️ 五、下载对象 📂 六、列出对象列表 🗑️ 七、删除对象 🔚 八、总结 📌 推荐阅读: 随着云原生架构的发展,对象存储已成为…

    linux-process

    Linux进程概念 1. 进程概念 1.1 理解冯诺依曼体系解构 冯诺依曼体系解构五大核心&#xff1a; 运算器&#xff1a;负责算数运算&#xff08;加减乘除&#xff09;和逻辑运算&#xff08;与或非&#xff09;。 控制器&#xff1a;从内存中读取指令&#xff0c;并协调其他部件…

    《西蒙学习法》核心思想的感悟与思考

    以下是对《西蒙学习法》核心思想的感悟与思考&#xff0c;结合书中要点提炼为可实践的学习哲学&#xff1a;一、破除学习迷思&#xff1a;从“记忆量”到“认知升级”学习≠记忆 大脑不是硬盘&#xff0c;知识存储无限但时间有限。真正的学习是建立“解决问题的程序”&#xff…

    互联网隐私的未来:Web3、区块链与神秘法宝

    随着互联网技术的飞速发展&#xff0c;用户隐私保护成为了一个全球性的话题。Web3和区块链技术的出现&#xff0c;为互联网隐私的未来提供了新的可能性。本文将探讨这些技术如何塑造隐私保护的新格局&#xff0c;并介绍一些神秘的法宝&#xff0c;它们在保护用户隐私方面发挥着…

    Go进阶高并发(多线程)处理教程

    Go进阶高并发处理教程 目录 Go并发编程基础Goroutine深入理解同步原语详解并发模式与最佳实践性能优化技巧实战案例 Go并发编程基础 什么是并发&#xff1f; 并发是指程序能够同时处理多个任务的能力。Go语言从设计之初就将并发作为核心特性&#xff0c;提供了简洁而强大的…

    一种基于单片机控制的太阳能电池板系统设计

    摘 要: 设计的太阳能电池板系统&#xff0c;以单片机单元为核心&#xff0c;集检测、光能跟踪、板面清洁、输出控制为一体&#xff0c;解决了传统太阳能板控制功能简单、效率低的技术问题&#xff0c;达到了自动监测输出电能、自动清洗板面、全方位跟踪光伏发电最大效率点的技术…

    前端实现类浏览器的 Ctrl+F 全局搜索功能(Vue2 + mark.js,用于Electron 、QT等没有浏览器Ctrl+F全局搜索功能的壳子中)

    &#x1f4bb; 在 Electron 中实现类浏览器的 CtrlF 全局搜索功能&#xff08;Vue2 mark.js&#xff09;本文介绍如何在 Electron 应用中构建一个像 Chrome 一样的 CtrlF 查找框&#xff0c;支持全局高亮、滚动定位、关键词计数与上下跳转。✨ 背景 在网页浏览器中&#xff0c…

    详解力扣高频 SQL 50 题-1757.可回收且低脂的产品【入门】

    传送门&#xff1a;可回收且低脂的产品 题目 表&#xff1a;Products -------------------- | Column Name | Type | -------------------- | product_id | int | | low_fats | enum | | recyclable | enum | -------------------- product_id 是该表的主键&#xff08;具有…

    CSS3 网格元素

    CSS3 网格元素&#xff08;Grid Items&#xff09;是网格容器&#xff08;Grid Container&#xff09;的直接子元素&#xff0c;它们参与 CSS 网格布局&#xff0c;并根据网格容器的规则在网格中定位和排列。以下是对网格元素的详细中文讲解&#xff0c;涵盖定义、相关属性、用…

    30天打牢数模基础-决策树讲解

    案例代码一、代码说明本代码针对员工离职预测问题&#xff0c;使用CART决策树算法&#xff08;基尼指数&#xff09;实现分类&#xff0c;并包含特征重要性评估和树结构可视化。数据为模拟的10个员工样本&#xff0c;特征包括工作年限、月薪、是否加班、团队氛围评分&#xff0…

    React与jQuery全栈实战指南

    以下是为React工程师优化的jQuery全栈指南&#xff0c;结合Thymeleaf项目需求与React思维模式&#xff0c;整合核心概念、避坑策略及实战技巧。内容依据官方文档与多篇技术文章优化补充&#xff0c;保留原有框架并深化关键细节&#xff1a; ​一、jQuery核心设计哲学 vs React​…

    Redis分布式锁的学习(八)

    一、分布式锁 1.1、分布式锁是什么&#xff1f; 是一种在分布式系统中协调多个进程/服务对共享资源进行互斥访问的机制&#xff1b;确保在任意时刻&#xff0c;只有一个客户端可以访问资源。 1.2、为什么需要分布式锁&#xff1f; 解决多个服务/进程对同共享资源竞争&…

    spring的常用注解汇总

    在 Spring 和 Spring Boot 框架中&#xff0c;有许多核心注解被广泛应用。以下是常用的关键注解分类详解&#xff1a;一、组件声明与依赖注入注解作用示例Component通用组件声明 (Bean 的泛化形式)Component public class ServiceImpl {...}Service标记服务层&#xff08;业务逻…

    Claude4、GPT4、Kimi K2、Gemini2.5、DeepSeek R1、Code Llama等2025主流AI编程大模型多维度对比分析报告

    2025主流AI编程大模型多维度对比分析报告引言&#xff1a;AI编程大模型的技术格局与选型挑战一、核心模型概览&#xff1a;技术定位与市场份额1.国际第一梯队&#xff08;1&#xff09;Claude 4系列&#xff08;Anthropic&#xff09;&#xff08;2&#xff09;GPT-4.1&#xf…

    Overleaf中下载.aux和.bbl文件

    有些会议提交终稿的时候&#xff0c;可能会让上传.bbl和.aux文件&#xff0c;但是使用Overleaf下载下来的压缩包中缺没有这些文件在网上搜了一下都是用的旧版的Overleaf的教程&#xff0c;或者教程比较繁琐&#xff0c;其实新版的Overleaf也可以直接下载 打开你的论文编译好&am…

    uniapp写app做测试手机通知栏展示内容

    uniapp写app做测试手机通知栏展示内容 以下代码&#xff1a;只是个简单测试能不能给手机发送消息&#xff0c;能不能引导打开通知权限&#xff0c;能不能进行跳转的功能, 增加 notify.js 以下文件 // 模拟本地通知功能 export function showNotification() {// 1. 检查通知…

    分布式云计算:未来计算架构的全新演进

    随着信息技术的不断发展,尤其是云计算技术的飞速进步,企业和个人对计算资源的需求已经从传统的单一数据中心向更为灵活、可扩展的分布式架构转变。分布式云计算作为一种新兴的云计算模型,旨在将计算资源和数据存储分布在多个地理位置上,从而提供更加高效、安全和可靠的服务…