数据分析-Pandas如何重塑数据表

数据分析-Pandas如何重塑数据表

数据表,时间序列数据在数据分析建模中很常见,例如天气预报,空气状态监测,股票交易等金融场景。数据分析过程中重新调整,重塑数据表是很重要的技巧,此处选择Titanic数据,以及巴黎、伦敦欧洲城市空气质量监测 N O 2 NO_2 NO2数据作为样例。


GPT专栏文章:

数据分析-Pandas如何转换产生新列

数据分析-Pandas如何统计数据概况

数据分析-Pandas如何轻松处理时间序列数据

数据分析-Pandas如何选择数据子集

经典算法-遗传算法的python实现

经典算法-模拟退火算法的python实现

大模型查询工具助手之股票免费查询接口

Python技巧-终端屏幕打印光标和文字控制


样例程序代码,需要可获取:

源代码参考 Pandas如何重塑数据表

源代码参考 python数据分析-数据表读写到pandas


样例分析数据,需要可获取:

Titanic数据

空气质量监测 N O 2 NO_2 NO2数据

数据重排列

拿到表格数据后,很多情况下不能直接就用,还需要对数据进行加工处理。数据加工之前,数据的探查就很重要,最常见的是想把表格的某个属性重新按值的大小排列,看有没有什么特点。

比如在Titanic数据中,想把年龄排序查看下年龄分布特征。可以这样操作:

In [1]: titanic.sort_values(by="Age").head()
Out[1]: 
     PassengerId  Survived  Pclass  ...     Fare Cabin  Embarked
803          804         1       3  ...   8.5167   NaN         C
755          756         1       2  ...  14.5000   NaN         S
644          645         1       3  ...  19.2583   NaN         C
469          470         1       3  ...  19.2583   NaN         C
78            79         1       2  ...  29.0000   NaN         S

[5 rows x 12 columns]

有或者,还想联合乘客座舱的等级和年龄,看看不同座舱的分布规律。可以排列多个属性,以列表形式。如下所示:

In [2]: titanic.sort_values(by=['Pclass', 'Age'], ascending=False).head()
Out[2]: 
     PassengerId  Survived  Pclass  ...    Fare Cabin  Embarked
851          852         0       3  ...  7.7750   NaN         S
116          117         0       3  ...  7.7500   NaN         Q
280          281         0       3  ...  7.7500   NaN         Q
483          484         1       3  ...  9.5875   NaN         S
326          327         0       3  ...  6.2375   NaN         S

[5 rows x 12 columns]

通过DataFrame.sort_values(),通过指定列名进行表格数据重排。

单列延展宽表

例如,需要关注不同监测站的 N O 2 NO_2 NO2监测值随时间变化情况,就重排表格,把数据进行延展。以下为图示

延展

为了方便起见,仅空气质量数据表的一个子集,仅关注 N O 2 NO_2 NO2监测值,且也值关注每个监测站的前2个数据情况。

比如no2_subset只保留 N O 2 NO_2 NO2监测值,需Paris 、London和 Antwerpen的前两个记录,结果如下:

# filter for no2 data only
In [3]: no2 = air_quality[air_quality["parameter"] == "no2"]
# use 2 measurements (head) for each location (groupby)
In [3]: no2_subset = no2.sort_index().groupby(["location"]).head(2)

In [4]: no2_subset
Out[4]: 
                                city country  ... value   unit
date.utc                                      ...             
2019-04-09 01:00:00+00:00  Antwerpen      BE  ...  22.5  µg/2019-04-09 01:00:00+00:00      Paris      FR  ...  24.4  µg/2019-04-09 02:00:00+00:00     London      GB  ...  67.0  µg/2019-04-09 02:00:00+00:00  Antwerpen      BE  ...  53.5  µg/2019-04-09 02:00:00+00:00      Paris      FR  ...  27.4  µg/2019-04-09 03:00:00+00:00     London      GB  ...  67.0  µg/[6 rows x 6 columns]

那么,每个监测站分别作为一个独立的属性列,可以使用pivot函数,这样操作:

In [5]: no2_subset.pivot(columns="location", values="value")
Out[5]: 
location                   BETR801  FR04014  London Westminster
date.utc                                                       
2019-04-09 01:00:00+00:00     22.5     24.4                 NaN
2019-04-09 02:00:00+00:00     53.5     27.4                67.0
2019-04-09 03:00:00+00:00      NaN      NaN                67.0

pivot()函数就是纯粹重排数据的,每列一个值。

pandas支持画不同列数据在同一张图上,共用相同的时间轴。

In [6]: no2.head()
Out[6]: 
                            city country location parameter  value   unit
date.utc                                                                 
2019-06-21 00:00:00+00:00  Paris      FR  FR04014       no2   20.0  µg/2019-06-20 23:00:00+00:00  Paris      FR  FR04014       no2   21.8  µg/2019-06-20 22:00:00+00:00  Paris      FR  FR04014       no2   26.5  µg/2019-06-20 21:00:00+00:00  Paris      FR  FR04014       no2   24.9  µg/2019-06-20 20:00:00+00:00  Paris      FR  FR04014       no2   21.4  µg/m³

In [7]: no2.pivot(columns="location", values="value").plot()
Out[7]: <AxesSubplot: xlabel='date.utc'>

如果需要分析每个监测站的 N O 2 NO_2 NO2监测值和 P M 2.5 PM_{2.5} PM2.5监测值的平均浓度。pivot只是重排表格,需要多值的重新聚合,pivot_table()函数就比较合适,提供聚合函数的功能。

In [8]: air_quality.pivot_table(
   ....:     values="value", index="location", columns="parameter", aggfunc="mean"
   ....: )
   ....: 
Out[8]: 
parameter                 no2       pm25
location                                
BETR801             26.950920  23.169492
FR04014             29.374284        NaN
London Westminster  29.740050  13.443568

就是熟悉的数据透视表功能。通常对行、列的聚合感兴趣。

In [9]: air_quality.pivot_table(
   ....:     values="value",
   ....:     index="location",
   ....:     columns="parameter",
   ....:     aggfunc="mean",
   ....:     margins=True,
   ....: )
   ....: 
Out[9]: 
parameter                 no2       pm25        All
location                                           
BETR801             26.950920  23.169492  24.982353
FR04014             29.374284        NaN  29.374284
London Westminster  29.740050  13.443568  21.491708
All                 29.430316  14.386849  24.222743

事实上,pivot_table和groupby()函数功能,获得相同的结果。

air_quality.groupby(["parameter", "location"]).mean()

宽表聚到单列

相反的,如果想把宽表合道一个列里头,又该怎么办?

宽变长

开始之前,先把表格弄成左边图的样子,用前面的知识。

In [10]: no2_pivoted = no2.pivot(columns="location", values="value").reset_index()

In [11]: no2_pivoted.head()
Out[11]: 
location                  date.utc  BETR801  FR04014  London Westminster
0        2019-04-09 01:00:00+00:00     22.5     24.4                 NaN
1        2019-04-09 02:00:00+00:00     53.5     27.4                67.0
2        2019-04-09 03:00:00+00:00     54.5     34.2                67.0
3        2019-04-09 04:00:00+00:00     34.5     48.5                41.0
4        2019-04-09 05:00:00+00:00     46.5     59.5                41.0

好了,现在老子就想把所有的 N O 2 NO_2 NO2监测值给我堆成一列。老板:不要问为什么!不用喷他,直接show结果,代码如下:

In [12]: no_2 = no2_pivoted.melt(id_vars="date.utc")

In [13]: no_2.head()
Out[13]: 
                   date.utc location  value
0 2019-04-09 01:00:00+00:00  BETR801   22.5
1 2019-04-09 02:00:00+00:00  BETR801   53.5
2 2019-04-09 03:00:00+00:00  BETR801   54.5
3 2019-04-09 04:00:00+00:00  BETR801   34.5
4 2019-04-09 05:00:00+00:00  BETR801   46.5

用melt()就能妥妥的完成任务,从宽表汇聚成1列,搞定。

如果遇到强迫症,需要把列名称和原来列属性更换名字,就还可以做的更好:

In [15]: no_2 = no2_pivoted.melt(
   ....:     id_vars="date.utc",
   ....:     value_vars=["BETR801", "FR04014", "London Westminster"],
   ....:     value_name="NO_2",
   ....:     var_name="id_location",
   ....: )
   ....: 

In [16]: no_2.head()
Out[16]: 
                   date.utc id_location  NO_2
0 2019-04-09 01:00:00+00:00     BETR801  22.5
1 2019-04-09 02:00:00+00:00     BETR801  53.5
2 2019-04-09 03:00:00+00:00     BETR801  54.5
3 2019-04-09 04:00:00+00:00     BETR801  34.5
4 2019-04-09 05:00:00+00:00     BETR801  46.5

以上代码只是一个简单示例,示例代码中的表达式可以根据实际问题进行修改。


样例程序代码,需要可获取:

源代码参考 Pandas如何重塑数据表

源代码参考 python数据分析-数据表读写到pandas


样例分析数据,需要可获取:

Titanic数据

空气质量监测 N O 2 NO_2 NO2数据


觉得有用 收藏 收藏 收藏

点个赞 点个赞 点个赞

End


GPT专栏文章:

GPT实战系列-ChatGLM3本地部署CUDA11+1080Ti+显卡24G实战方案

GPT实战系列-LangChain + ChatGLM3构建天气查询助手

大模型查询工具助手之股票免费查询接口

GPT实战系列-简单聊聊LangChain

GPT实战系列-大模型为我所用之借用ChatGLM3构建查询助手

GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(二)

GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(一)

GPT实战系列-ChatGLM2模型的微调训练参数解读

GPT实战系列-如何用自己数据微调ChatGLM2模型训练

GPT实战系列-ChatGLM2部署Ubuntu+Cuda11+显存24G实战方案

GPT实战系列-Baichuan2本地化部署实战方案

GPT实战系列-Baichuan2等大模型的计算精度与量化

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF

GPT实战系列-探究GPT等大模型的文本生成-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS 学习相关笔记 附C语言内容补充

学习视频为【正点原子】手把手教你学FreeRTOS实时系统 文章目录 RTOS 入门裸机RTOSFreeRTOS任务调度方式任务状态 FreeRTOS 移植系统配置文件 API函数任务创建和删除动态方式创建任务静态方式创建任务删除任务 任务挂起和恢复函数调度器挂起与恢复临界区任务调度器的挂起和恢复…

anoconda 安装报错

表现形式&#xff1a;Output folder: D:\anoconda\Lib Extract: _nsis.py Extract: _system_path.py Output folder: D:\anoconda........................ 解决办法&#xff1a; 网址&#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Sour…

Java循环语句

1&#xff1a;for循环结构 循环结构有三种语句&#xff0c;分别是&#xff1a; for循环 while循环 do…while循环 这三种循环可以做相同的事情&#xff0c;当然它们也有小的区别 1.1 for循环结构 这段代码的作用&#xff0c;是用来展示手机信息1000次。 还提到了这里的几…

Rust-trait

Rust语言中的trait是非常重要的概念。 在Rust中&#xff0c;trait这一个概念承担了多种职责。在中文里&#xff0c;trait可以翻译为“特征”“特点”“特性”等。 成员方法 trait中可以定义函数。用例子来说明&#xff0c;我们定义如下的trait: 上面这个trait包含了一个方法…

甜蜜而简洁 —— 深入了解Pytest插件pytest-sugar

在日常的软件开发中&#xff0c;测试是确保代码质量的关键步骤之一。然而&#xff0c;对于测试报告的生成和测试结果的可读性&#xff0c;一直以来都是开发者关注的焦点。Pytest插件 pytest-sugar 以其清晰而美观的输出&#xff0c;为我们提供了一种愉悦的测试体验。本文将深入…

Springboot WebFlux项目结合mongodb进行crud

第一步&#xff1a;创建项目 第二步&#xff1a;给mongodb插入数据 第三步&#xff1a;创建实体类 package org.cyl.test02.entity;// Task.java import lombok.Data;Data public class Task {private String id;private String description; }第四步&#xff1a;创建Reposito…

React Native 原生组件回调JS层方法和 JS 层调用原生组件的事件方法

一、原生组件回调 JS 层提供的事件方法 比如 TextInput 组件 onChangeText 属性&#xff0c;输入事件是发生在原生层的但是需要通知 JS 层发生了变化&#xff0c;并执行 JS 层的方法。 1、给原生组件添加一个按钮用于触发原生事件方法 在 XML 中添加一个按钮 为了方便让 Inf…

三、电脑软件路径移动方式

一、电脑文件移动 当我们想整理硬盘或者移动软件时&#xff0c;常常会遇到多种多样的问题&#xff0c;下面就来说明一下我遇到的问题 1.桌面 解释&#xff1a;移动路径会导致桌面快捷方式失效&#xff0c;下面以图片解答如何恢复 原理&#xff1a;桌面快捷方式保存在C:\Users…

java基于SSM框架的宿舍管理系统的设计与实现论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对宿舍信息管理的提升&#xff0c…

ubuntu22.04虚拟机安装教程

ubuntu22.04虚拟机安装教程 1.下载镜像&#xff1a; https://ubuntu.com/ 打开后点击Download: 或者用清华镜像源下载&#xff1a;滑到最底下&#xff0c;点击ubuntu-releases 选中这个版本ubuntu-22.04.3-desktop-amd64点击下载 2.虚拟机加载&#xff1a;打开VM&#xff0…

Debian12 安装jenkins 公钥配置

jenkins公钥配置 参考&#xff1a;Debian Jenkins 软件包 这是 Jenkins 的 Debian 软件包存储库&#xff0c;用于自动安装和升级。 要使用此存储库&#xff0c;请先将密钥添加到您的系统&#xff08;对于每周发布行&#xff09;&#xff1a; sudo wget -O /usr/share/keyring…

2024年湖北职称评审对论文的要求

1.期刊发表版面的时间节点2024年12月及之前 2.期刊是正规的期刊&#xff0c;有国内刊号 3.期刊能在国家出版社总署检索到 4.文章内容查重符合知网查重标准 5.论文方向和申报专业方向一致 6.必须要是第一作者或者独著 7.评正高的人才们要准备中文核心论文两篇或出版专业学术论著…

【JVM】类的生命周期

目录 类的生命周期 加载阶段 连接阶段 初始化阶段 类的使用阶段 类的加载阶段 类的生命周期 加载阶段 在加载阶段&#xff0c;类加载器首先会通过一个类的全限定名来获取定义此类的二进制字节流。这个步骤主要是将整个Class 文件解析成二进制流。 &#xff08;全限定名是…

基于OCR的包装产品生产日期识别系统

基于OCR的包装产品生产日期识别系统 背景技术方案PaddleOCR模型应用数据挑战与解决方案优化策略 项目实施步骤结果与展望 背景 在工业生产中&#xff0c;产品包装上的生产日期信息是至关重要的&#xff0c;它关系到物资的时效性和质量。为了更快、更准确地提取这些信息&#x…

便捷特惠的快递寄件快递物流折扣平台 ,通常都有什么常见问题?

首先&#xff0c;最重要的一点是怎么寄快递更便宜&#xff1f; 我们在寄快递时&#xff0c;尽量把包裹压缩空间大一点&#xff0c;这样在体积上面就会减少一部分的费用呢&#xff0c;另外就是选择有优惠的平台下单。例如在闪侠惠递平台下单&#xff0c;单单打折&#xff0c;单…

Redis分布式锁--java实现

文章目录 Redis分布式锁方案&#xff1a;SETNX EXPIRE基本原理比较好的实现会产生四个问题 几种解决原子性的方案方案&#xff1a;SETNX value值是&#xff08;系统时间过期时间&#xff09;方案&#xff1a;使用Lua脚本(包含SETNX EXPIRE两条指令)方案&#xff1a;SET的扩展…

python爬虫,验证码识别,携带cookies请求

古诗词网案例&#xff01;&#xff01;&#xff01; 识别验证码类型&#xff1a; # 此处用到的图片验证码识别网址为&#xff1a;http://ttshitu.com/ 图鉴 import base64 import json import requests # 一、图片文字类型(默认 3 数英混合)&#xff1a; # 1 : 纯数字 # 1001&…

@PreAuthorize注解

前言&#xff1a;RuoYi框架中&#xff0c;菜单管理的权限标识字段通常用于定义用户对特定菜单或操作的访问权限。 这个权限标识字段通常会被用在两个地方&#xff1a; 1. 后端&#xff1a;在Spring Security的PreAuthorize注解中&#xff0c;用于控制对特定方法的访问。例如&am…

JavaScript 异步编程解决方案-中篇

天下事有难易乎&#xff1f; 为之&#xff0c;则难者亦易矣&#xff1b;不为&#xff0c; 则易者亦难矣。人之为学有难易乎&#xff1f; 学之&#xff0c;则难者亦易矣&#xff1b;不学&#xff0c;则易者亦难矣。 async 函数 和promise then的规则一样 async function fun() …

ORA-12541:TNS:无监听程序

1.重新配置监听 找到监听程序配置&#xff0c;右键已管理员身份运行 选择第二个&#xff1a;重新配置 这个一般没什么好选的 默认选定的协议TCP&#xff0c;继续下一步 默认的否 继续下一步&#xff0c;完成监听重新配置 之后进行测试看能否连上 2.本地Net服务名配置 …