Data used for this tutorial:
  • 本教程使用泰坦尼克号数据集,它以 CSV 格式存储。该数据包含以下数据列:

    • PassengerId:每位乘客的 ID。

    • Survived:乘客是否存活的指示。0 表示生存,1 表示死亡。

    • Pclass:3 个票务等级之一:1 等、2 等和 3 等。

    • Name:乘客姓名。

    • Sex:乘客性别。

    • Age:乘客年龄(以年为单位)。

    • SibSp:船上兄弟姐妹或配偶的数量。

    • Parch:船上父母或子女的数量。

    • Ticket:乘客的票号。

    • Fare:指示票价。

    • Cabin:乘客的客舱号。

    • Embarked:登船港口。

    To raw data
  • 本教程使用由 \(NO_2\) 提供、并使用 OpenAQ 包提供的关于 py-openaq 和小于2.5微米的颗粒物(PM$_{2.5}$) 的空气质量数据。air_quality_long.csv 数据集分别在巴黎、安特卫普和伦敦提供了测量站 FR04014BETR801London Westminster\(NO_2\)\(PM_{25}\) 值。

    空气质量数据集包含以下列:

    • city: 传感器使用的城市,巴黎、安特卫普或伦敦

    • country: 传感器使用的国家,FR、BE 或 GB

    • location: 传感器 ID,FR04014BETR801London Westminster

    • parameter: 传感器测量的参数,\(NO_2\) 或颗粒物

    • value: 测量值

    • unit: 测量参数的单位,本例中为 ‘µg/m³’

    DataFrame 的索引是 datetime,即测量时间。

    备注

    空气质量数据以所谓的*长格式*数据表示形式提供,每个观测值占一行,每个变量占数据表的一列。长/窄格式也称为 tidy data format

    To raw data

如何重塑表格布局#

对表格行进行排序#

  • 我想根据乘客的年龄对泰坦尼克号数据进行排序。

  • 我想根据客舱类别和年龄降序对泰坦尼克号数据进行排序。

    使用 DataFrame.sort_values() ,根据定义的列对表格中的行进行排序。索引将跟随行的顺序。

To user guide

有关表格排序的更多详细信息,请参阅用户指南的 sorting data 部分。

长表到宽表格式#

我们使用空气质量数据集的一个小子集。我们关注 \(NO_2\) 数据,并且只使用每个地点的最初两次测量(即每组的头部)。数据集的子集将称为 no2_subset

../../_images/07_pivot.svg
  • 我希望三个站点的值作为单独的列并排显示。

    pivot() 函数纯粹是数据的重塑:需要每个索引/列组合的单个值。

由于 pandas 内置支持绘制多列(请参阅 plotting tutorial ),因此从*长*表格式到*宽*表格式的转换使得能够同时绘制不同的时间序列:

备注

当未定义 index 参数时,将使用现有索引(行标签)。

To user guide

有关 pivot() 的更多信息,请参阅用户指南的 pivoting DataFrame objects 部分。

透视表#

../../_images/07_pivot_table.svg
  • 我想要每个站点 \(NO_2\)\(PM_{2.5}\) 的平均浓度,以表格形式展示。

    pivot() 的情况下,数据只是被重新排列。当需要聚合多个值时(在本例中,是不同时间步的值),可以使用 pivot_table() ,它提供了一个聚合函数(例如,mean),用于如何组合这些值。

透视表是电子表格软件中一个众所周知的概念。当对每个变量的行/列边缘(小计)感兴趣时,将 margins 参数设置为 True

To user guide

有关 pivot_table() 的更多信息,请参阅用户指南关于 pivot tables 的部分。

备注

如果您想知道,pivot_table() 确实直接与 groupby() 相关联。通过同时对 parameterlocation 进行分组,可以获得相同的结果:

air_quality.groupby(["parameter", "location"])[["value"]].mean()
To user guide

宽格式到长格式#

再次从上一节创建的宽格式表中开始,我们使用 reset_index()DataFrame 添加一个新索引。

../../_images/07_melt.svg
  • 我想要将所有的 \(NO_2\) 空气质量测量值收集到单个列中(长格式)。

    DataFrame 上的 pandas.melt() 方法将数据表从宽格式转换为长格式。列标题将成为新创建列中的变量名。

解决方案是 pandas.melt() 的简写形式。该方法会将 id_vars 中未提及的所有列“融化”成两列:一列包含列标题名称,另一列包含值本身。后者默认名为 value

可以更详细地定义传递给 pandas.melt() 的参数:

附加参数具有以下效果:

  • value_vars 定义了要一起“融化”的列。

  • value_name 提供了一个自定义的列名,用于值列,而不是默认的列名 value

  • var_name 为收集列标题名称的列提供了一个自定义的列名。否则,它会采用索引名称或默认的 variable

因此,参数 value_namevar_name 只是为生成的两列设置的用户定义名称。要融化的列由 id_varsvalue_vars 定义。

To user guide

有关使用 pandas.melt() 从宽格式到长格式的转换,请参阅用户指南关于 reshaping by melt 的部分。

REMEMBER

  • “sort_values”支持按一列或多列进行排序。

  • pivot 函数纯粹是数据的重构,“pivot_table”支持聚合。

  • pivot 的反向操作(长到宽格式)是 ``melt``(宽到长格式)。

To user guide

完整的概述可以在用户指南关于 reshaping and pivoting 的页面上找到。