数据分析-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数据中,想把年龄排序查看下年龄分布特征。可以这样操作:

python 复制代码
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]

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

python 复制代码
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的前两个记录,结果如下:

python 复制代码
# 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/m³
2019-04-09 01:00:00+00:00      Paris      FR  ...  24.4  µg/m³
2019-04-09 02:00:00+00:00     London      GB  ...  67.0  µg/m³
2019-04-09 02:00:00+00:00  Antwerpen      BE  ...  53.5  µg/m³
2019-04-09 02:00:00+00:00      Paris      FR  ...  27.4  µg/m³
2019-04-09 03:00:00+00:00     London      GB  ...  67.0  µg/m³

[6 rows x 6 columns]

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

python 复制代码
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支持画不同列数据在同一张图上,共用相同的时间轴。

python 复制代码
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/m³
2019-06-20 23:00:00+00:00  Paris      FR  FR04014       no2   21.8  µg/m³
2019-06-20 22:00:00+00:00  Paris      FR  FR04014       no2   26.5  µg/m³
2019-06-20 21:00:00+00:00  Paris      FR  FR04014       no2   24.9  µg/m³
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()函数就比较合适,提供聚合函数的功能。

python 复制代码
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

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

python 复制代码
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()函数功能,获得相同的结果。

python 复制代码
air_quality.groupby(["parameter", "location"]).mean()

宽表聚到单列

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

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

python 复制代码
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结果,代码如下:

python 复制代码
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列,搞定。

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

python 复制代码
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博客

相关推荐
布说在见1 小时前
层次与网络的视觉对话:树图与力引导布局的双剑合璧
信息可视化·数据挖掘·数据分析
丕羽2 小时前
【Pytorch】基本语法
人工智能·pytorch·python
bryant_meng2 小时前
【python】Distribution
开发语言·python·分布函数·常用分布
m0_594526303 小时前
Python批量合并多个PDF
java·python·pdf
工业互联网专业3 小时前
Python毕业设计选题:基于Hadoop的租房数据分析系统的设计与实现
vue.js·hadoop·python·flask·毕业设计·源码·课程设计
钱钱钱端4 小时前
【压力测试】如何确定系统最大并发用户数?
自动化测试·软件测试·python·职场和发展·压力测试·postman
慕卿扬4 小时前
基于python的机器学习(二)—— 使用Scikit-learn库
笔记·python·学习·机器学习·scikit-learn
Json____4 小时前
python的安装环境Miniconda(Conda 命令管理依赖配置)
开发语言·python·conda·miniconda
小袁在上班4 小时前
Python 单元测试中的 Mocking 与 Stubbing:提高测试效率的关键技术
python·单元测试·log4j
白狐欧莱雅4 小时前
使用python中的pygame简单实现飞机大战游戏
经验分享·python·游戏·pygame