Pandas 数据分析入门详解

今日内容大纲介绍
  • DataFrame读写文件

  • DataFrame加载部分数据

  • DataFrame分组聚合计算

  • DataFrame常用排序方式


1.DataFrame-保存数据到文件
  • 格式

    df对象.to_数据格式(路径)
    ​
    # 例如:
    df.to_csv('data/abc.csv')

  • 代码演示

    如要保存的对象是计算的中间结果,或者以后会在Python中复用,推荐保存成pickle文件

    如果保存成pickle文件,只能在python中使用, 文件的扩展名可以是.p,.pkl,.pickl

    # output文件夹必须存在
    df.to_pickle('output/scientists.pickle')                         # 保存为 pickle文件 
    df.to_csv('output/scientists.csv')                               # 保存为 csv文件     
    df.to_excel('output/scientists.xlsx')                             # 保存为 Excel文件 
    df.to_excel('output/scientists_noindex.xlsx', index=False)        # 保存为 Excel文件 
    df.to_csv('output/scientists_noindex.csv', index=False)           # 保存为 Excel文件 
    df.to_csv('output/scientists_noindex.tsv', index=False, sep='\t') 
    ​
    print('保存成功')

  • 注意, pandas读写excel需要额外安装如下三个包

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlwt 
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd

2.DataFrame-读取文件数据
  • 格式

    pd对象.read_数据格式(路径)
    ​
    # 例如:
    pd.read_csv('data/movie.csv')

  • 代码演示

    # pd.read_pickle('output/scientists.pickle')  # 读取Pickle文件中的内容
    # pd.read_excel('output/scientists.xlsx')     # 多1个索引列
    # pd.read_csv('output/scientists.csv')        # 多1个索引列
    ​
    pd.read_csv('output/scientists_noindex.csv')  # 正常数据

3.DataFrame-数据分析入门
  • 回顾 DataFrameSeries概念

    • Pandas是用于数据分析的开源Python库,可以实现数据加载,清洗,转换,统计处理,可视化等功能

    • DataFrame和Series是Pandas最基本的两种数据结构

    • DataFrame用来处理结构化数据(SQL数据表,Excel表格)

    • Series用来处理单列数据,也可以把DataFrame看作由Series对象组成的字典或集合

  • 按列加载数据

    做数据分析首先要加载数据,并查看其结构和内容,对数据有初步的了解 查看行,列数据分布情况 查看每一列中存储信息的类型

    import pandas as pd
    ​
    # 1. 加载数据
    df = pd.read_csv('data/gapminder.tsv', sep='\t')    # 指定切割符为\t
    df.head()
    ​
    # 2. # 查看df类型
    type(df)
    df.shape        # (1704, 6)
    df.columns      # Index(['country', 'continent', 'year', 'lifeExp', 'pop', 'gdpPercap'], dtype='object')
    df.index        # RangeIndex(start=0, stop=1704, step=1)
    df.dtypes       # 查看df对象 每列的数据类型
    df.info()       # 查看df对象 详细信息
    ​
    ​
    # 3. 加载一列数据
    # country_series = df['country']
    country_series = df.country     # 效果同上
    country_series.head()           # 查看前5条数据
    # 细节: 如果写 df['country'] 则是Series对象, 如果写 df[['country']]则是df对象
    ​
    ​
    # 4. 加载多列数据
    subset = df[['country', 'continent', 'year']]    # df对象
    print(subset.tail())

  • 按行加载数据

    # 1. 按行加载数据
    df.head()       # 获取前5条, 最左侧是一列行号, 也是 df的行索引, 即: Pandas默认使用行号作为 行索引.
    ​
    # 2. 使用 tail()方法, 获取最后一行数据
    df.tail(n=1)
    ​
    # 3. 演示 iloc属性 和 loc属性的区别,  loc属性写的是: 行索引值.  iloc写的是行号.
    df.tail(n=1).loc[1703]
    df.tail(n=1).iloc[0]        # 效果同上.
    ​
    # 4. loc属性 传入行索引, 来获取df的部分数据(一行, 或多行)
    df.loc[0]       # 获取 行索引为 0的行
    df.loc[99]      # 获取 行索引为 99的行
    df.loc[[0, 99, 999]]    # loc属性, 根据行索引值, 获取多条数据.
    ​
    # 5. 获取最后一条数据
    # df.loc[-1]          # 报错
    df.iloc[-1]           # 正确

  • 获取指定行/列数据

    # 1. 获取指定 行|列 数据
    df.loc[[0, 1, 2], ['country', 'year', 'lifeExp']]  # 行索引, 列名
    df.iloc[[0, 1, 2], [0, 2, 3]]  # 行索引, 列的编号
    ​
    # 2. 使用loc 获取所有行的, 某些列
    df.loc[:, ['year', 'pop']]  # 获取所有行的 year 和 pop列数据
    ​
    # 3. 使用 iloc 获取所有行的, 某些列
    df.iloc[:, [2, 3, -1]]  # 获取所有行的, 索引为: 2, 3 以及 最后1列数据
    ​
    # 4. loc只接收 行列名,  iloc只接收行列序号, 搞反了, 会报错.
    # df.loc[:, [2, 3, -1]]   # 报错
    # df.iloc[:, ['country', 'continent']]    # 报错
    ​
    # 5. 也可以通过 range()生成序号, 结合 iloc 获取连续多列数据.
    df.iloc[:, range(1, 5, 2)]
    df.iloc[:, list(range(1, 5, 2))]  # 把range()转成列表, 再传入, 也可以.
    ​
    # 6. 在iloc中, 使用切片语法 获取 n列数据.
    df.iloc[:, 3:5]   # 获取列编号为 3 ~ 5 区间的数据, 包左不包右, 即: 只获取索引为3, 4列的数据.
    df.iloc[:, 0:6:2] # 获取列编号为 0 ~ 6 区间, 步长为2的数据, 即: 只获取索引为0, 2, 4列的数据.
    ​
    # 7. 使用loc 和 iloc 获取指定行, 指定列的数据.
    df.loc[42, 'country']   # 行索引为42, 列名为:country 的数据
    df.iloc[42, 0]          # 行号为42, 列编号为: 0 的数据
    ​
    # 8. 获取多行多列
    df.iloc[[0, 1, 2], [0, 2, 3]]  # 行号, 列的编号
    df.loc[2:6, ['country', 'lifeExp', 'gdpPercap']]    # 行索引, 列名  推荐用法.

4.DataFrame-分组聚合计算
  • 概述

    • 在我们使用Excel或者SQL进行数据处理时,Excel和SQL都提供了基本的统计计算功能

    • 当我们再次查看gapminder数据的时候,可以根据数据提出几个问题

      • 每一年的平均预期寿命是多少?

      • 每一年的平均人口和平均GDP是多少?

      • 如果我们按照大洲来计算,每年个大洲的平均预期寿命,平均人口,平均GDP情况又如何?

      • 在数据中,每个大洲列出了多少个国家和地区?

  • 分组方式

    • 对于上面提出的问题,需要进行分组-聚合计算

    • 先将数据分组(每一年的平均预期寿命问题 按照年份将相同年份的数据分成一组

    • 对每组的数据再去进行统计计算如,求平均,求每组数据条目数(频数)等

    • 再将每一组计算的结果合并起来

    • 可以使用DataFrame的groupby方法完成分组/聚合计算

  • 语法格式

    df.groupby('分组字段')['要聚合的字段'].聚合函数()
    df.groupby(['分组字段','分组字段2'])[['要聚合的字段','要聚合的字段2']].聚合函数()

    分组后默认会把分组字段作为结果的行索引(index)

    如果是多字段分组, 得到的是MultiIndex(复合索引), 此时可以通过reset_index() 把复合索引变成普通的列

    例如: df.groupby(['year', 'continent'])[['lifeExp', 'gdpPercap']].mean().reset_index()

    基本代码调用的过程

    • 通过df.groupby('year')先创一个分组对象

    • 从分组之后的数据DataFrameGroupBy中,传入列名进行进一步计算返回结果为一个 SeriesGroupBy ,其内容是分组后的数据

    • 对分组后的数据计算平均值

  • 代码演示

    # 1. 统计每年, 平均预期寿命
    # SQL写法: select year, avg(lifeExp) from 表名 group by year;
    df.groupby('year')['lifeExp'].mean()
    ​
    # 2. 上述代码, 拆解介绍.
    df.groupby('year')                    # 它是1个 DataFrameGroupBy  df分组对象.
    df.groupby('year')['lifeExp']         # 从df分组对象中提取的 SeriesGroupBy Series分组对象(即: 分组后的数据)
    df.groupby('year')['lifeExp'].mean()  # 对 Series分组对象(即: 分组后的数据), 具体求平均值的动作.
    ​
    # 3. 对多列值, 进行分组聚合操作.
    # 需求: 按照年, 大洲分组, 统计每年, 每个大洲的 平均预期寿命, 平均gdp
    df.groupby(['year', 'continent'])[['lifeExp', 'gdpPercap']].mean()
    ​
    # 4. 统计每个大洲, 列出了多少个国家和地区.
    df.groupby('continent')['country'].value_counts()   # 频数计算, 即: 每个洲, 每个国家和地区 出现了多少次.
    df.groupby('continent')['country'].nunique()        # 唯一值计数, 即: 每个大洲, 共有多少个国家和地区 参与统计.

5.Pandas-基本绘图
  • 概述

    • 可视化在数据分析的每个步骤中都非常重要

    • 在理解或清理数据时,可视化有助于识别数据中的趋势

  • 参考代码

    data = df.groupby('year')['lifeExp'].mean()     # Series对象
    data.plot()     # 默认绘制的是: 折线图. 更复杂的绘图, 后续详解.

6.Pandas-常用排序方法
  • 第1步: 加载并查看数据

    import pandas as pd
    ​
    # 1. 加载数据.
    movie = pd.read_csv('data/movie.csv')
    movie.head()
    ​
    # 2. 查看数据字段说明.
    movie.columns
    ​
    # 3. 查看数据行列数
    movie.shape     # (4916, 28)
    ​
    # 4. 统计数值列, 并进行转置.
    movie.describe()
    movie.describe().T      # T表示转置操作, 即: 行列转换.
    ​
    # 5. 统计对象 和 类型列
    movie.describe(include='all')   # 统计所有的列, 包括: 数值列, 类别类型, 字符串类型
    movie.describe(include=object)  # 类别类型, 字符串类型
    ​
    # 6. 通过info() 方法了解不同字段的条目数量,数据类型,是否缺失及内存占用情况
    movie.info()

  • 第2步: 完整具体的需求

    # 需求1: 找到小成本, 高口碑电影.
    # 即: 从最大的N个值中, 选取最小值.
    ​
    # 1. 加载数据.
    movie2 = movie[['movie_title', 'imdb_score', 'budget']] # 电影名, 电影评分, 成本(预算)
    ​
    # nlargest(): 获取某个字段取值最大的前n条数据.
    # nsmallest(): 获取某个字段取值最大的前n条数据.
    # 2. 用 nlargest()方法, 选出 imdb_score 分数最高的100个数据.
    movie2.nlargest(100, 'imdb_score')
    ​
    # 3. 用 smallest()方法, 从上述数据中, 挑出预算最小的 5步电影.
    movie2.nlargest(100, 'imdb_score').nsmallest(5, 'budget')
    ​
    ​
    ​
    ​
    # 需求2: 找到每年imdb评分最高的电影
    # 1. 获取数据.
    movie3 = movie[['movie_title', 'title_year', 'imdb_score']] # 电影名, 上映年份, 电影评分
    ​
    # 2. sort_values() 按照年排序.
    movie3.sort_values('title_year', ascending=False).head()    # 按年降序排列, 查看数据.
    ​
    # 3. 同时对 title_year, imdb_score 两列进行排序.
    # movie4 = movie3.sort_values(['title_year', 'imdb_score'], ascending=[False, False])
    movie4 = movie3.sort_values(['title_year', 'imdb_score'], ascending=False)  # 效果同上
    movie4.head()
    ​
    # 4. 用 drop_duplicates()去重, 只保留每年的第一条数据
    # subset: 指定要考虑重复的列。
    # keep:   first/last/False   去重的时候, 保留第一条/保留最后一条/删除所有
    movie4.drop_duplicates(subset='title_year').head()   

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

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

相关文章

CQRS模型解析

简介 CQRS中文意思为命令于查询职责分离,我们可以将其了解成读写分离的思想。分为两个部分 业务侧和数据侧,业务侧主要执行的就是数据的写操作,而数据侧主要执行的就是数据的读操作。当然两侧的数据库可以是不同的。目前最为常用的CQRS思想方…

C++调用C# DLL之踩坑记录

C是非托管代码,C#则是托管代码,无法直接调用 CLR的介绍见CLR简介 MSDN提到了两种非托管-托管的交互技术:CLR Interop和COM Interop 后者要将C# 类库注册为COM组件,本文只探讨CLR,要通过C CLR写中间层代码 方式一&…

获取参数

获取querystring参数 querystring 指的是URL中 ? 后面携带的参数,例如:http://127.0.0.1:9090/web?query杨超越。 获取请求的querystring参数的方法如下: 方法1: Query package main// querystringimport ("github.com/…

引领长期投资新篇章:价值增长与财务安全的双重保障

随着全球金融市场的不断演变,长期投资策略因其稳健性和对价值增长的显著推动作用而日益受到投资者的重视。在这一背景下,Zeal Digital Shares(ZDS)项目以其创新的数字股票产品,为全球投资者提供了一个全新的长期投资平…

最优化理论与自动驾驶(十一):基于iLQR的自动驾驶轨迹跟踪算法(c++和python版本)

最优化理论与自动驾驶(四):iLQR原理、公式及代码演示 之前的章节我们介绍过,iLQR(迭代线性二次调节器)是一种用于求解非线性系统最优控制最优控制最优控制和规划问题的算法。本章节介绍采用iLQR算法对设定…

分析redis实现分布式锁的思路

文章目录 1、基于redis实现分布式锁:利用key的唯一性1.1、独占排他1.2、死锁问题1.2.1、redis客户端程序获取了锁之后,服务器立马宕机,就会导致死锁。1.2.2、不可重入:可重入 1.3、原子性:加锁和过期之间:s…

深入剖析Docker容器安全:挑战与应对策略

随着容器技术的广泛应用,Docker已成为现代应用开发和部署的核心工具。它通过轻量级虚拟化技术实现应用的隔离与封装,提高了资源利用率。然而,随着Docker的流行,其安全问题也成为关注焦点。容器化技术虽然提供了良好的资源隔离&…

4.C_数据结构_队列

概述 什么是队列: 队列是限定在两端进行插入操作和删除操作的线性表。具有先入先出(FIFO)的特点 相关名词: 队尾:写入数据的一段队头:读取数据的一段空队:队列中没有数据,队头指针 队尾指针满队&#…

FPGA与Matlab图像处理之直方图均衡化

文章目录 一、什么是直方图?二、什么是直方图均衡化?三、Matlab实现直方图均衡化的步骤第一步: 彩色图像转成灰度图像第二步:提取亮度通道的直方图第三步:累计亮度通道的像素值频率第四步: 映射到新的灰度值 四、Veri…

嵌入式 开发技巧和经验分享

文章目录 前言嵌入式 开发技巧和经验分享目录1.1嵌入式 系统的 定义1.2 嵌入式 操作系统的介绍1.3 嵌入式 开发环境1.4 编译工具链和优化1.5 嵌入式系统软件开发1.6 嵌入式SDK开发2.1选择移植的系统-FreeRtos2.2FreeRtos 移植步骤2.3 系统移植之中断处理2.4系统移植之内存管理2…

【java面经】Redis速记

目录 基本概念 string hash list set zset 常见问题及解决 缓存穿透 缓存击穿 缓存雪崩 Redis内存管理策略 noeviction allkeys-lru allkeys-random volatile-random volatile-ttl Redis持久化机制 RDB快照 AOF追加文件 Redis多线程特性 Redis应用场景 缓…

【医学半监督】置信度指导遮蔽学习的半监督医学图像分割

摘要: 半监督学习(Semi-supervised learning)旨在利用少数标记数据和多数未标记数据训练出高性能模型。现有方法大多采用预测任务机制,在一致性或伪标签的约束下获得精确的分割图,但该机制通常无法克服确认偏差。针对这一问题,本文提出了一种用于半监督医学图像分割的新…

【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的?

【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的? 【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的? 文章目录 【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的?1. 什么是梯度?2.梯度…

2024-04-23 人工智能增强天基通信和传感

砺道智库2024-04-23 11:18 北京 据国家防务网4月19日报道,随着商业卫星、军事星座及其所有数据在太空中流动的数量不断增加,政府和行业运营商表示,他们正在寻求人工智能来帮助他们处理日益复杂的任务。 人工智能软件使用户能够在轨道上改变航…

饲料颗粒机全套设备有哪些机器组成

饲料颗粒机全套设备通常包括原料粉碎、混合机、制粒机、冷却器、筛分机、包装机以及配套的电气控制等多个部分组成:1、粉碎机:将各种饲料原料进行清理、去杂、破碎等预处理,确保原料的纯净度和适宜粒度,为后续加工做准备。2、混合…

【永磁同步电机(PMSM)】 5. PMSM 的仿真模型

【永磁同步电机(PMSM)】 5. PMSM 的仿真模型 1. 基于 Simulink 的仿真模型1.1 PMSM 的数学模型1.2 Simulink 仿真模型1.3 模块封装(mask)1.4 三相PMSM矢量控制仿真模型 2. Simscape 的 PMSM 模块2.1 PMSM 模块的配置2.2 PMSM 模块…

数据结构与算法学习day22-回溯算法-分割回文串、复原IP地址、子集

一、分割回文串 1.题目 131. 分割回文串 - 力扣(LeetCode) 2.思路 分割回文串可以抽象为一棵树形结构。 递归用来纵向遍历,for循环用来横向遍历,切割线(就是图中的红线)切割到字符串的结尾位置&#xf…

WIFI路由器的套杆天线简谈

❝本次推文简单介绍下WIFI路由器的套杆天线。 路由器天线 路由器在这个万物互联的时代,想必大家对其都不陌生。随着科技的发展,常用的路由器上的天线也越来越多,那么问题来了:天线越多,信号越好吗?路由器…

浅谈Spring Cloud:认识微服务

SpringCloud就是分布式微服务架构的一站式解决方案,是微服务架构落地的多种技术的集合。 目录 微服务远程调用 Eureka注册中心 搭建Eureka Server 注册组件 服务拉取 当各种各样的服务越来越多,拆分的也越来越细,此时就会出现一个服务集…

计算机毕业设计 社区医疗服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…