In [1]: import pandas as pd 本教程使用的数据: 泰坦尼克号数据 本教程使用泰坦尼克号数据集,存储为 CSV。数据由以下数据列组成: PassengerId:每位乘客的 ID。 Survived:表示乘客是否幸存。0对于是和1否。 Pclass:3 个票价类别之一: Class 1、 Class2和 Class 3。 姓名:乘客姓名。 性别:乘客的性别。 年龄:乘客的年龄(岁)。 SibSp:船上兄弟姐妹或配偶的数量。 Parch:船上父母或儿童的数量。 票号:旅客的票号。 票价:表示票价。 客舱:乘客的客舱编号。 登船:登船港口。 至原始数据 In [2]: titanic = pd.read_csv("data/titanic.csv") In [3]: titanic.head() Out[3]: PassengerId Survived Pclass ... Fare Cabin Embarked 0 1 0 3 ... 7.2500 NaN S 1 2 1 1 ... 71.2833 C85 C 2 3 1 3 ... 7.9250 NaN S 3 4 1 1 ... 53.1000 C123 S 4 5 0 3 ... 8.0500 NaN S [5 rows x 12 columns] 空气质量数据 本教程使用以下空气质量数据\(NO_2\)小于 2.5 微米的颗粒物,由OpenAQ提供 并使用 py-openaq软件包。数据air_quality_long.csv集提供\(NO_2\)和 \(PM_{25}\)分别位于巴黎、安特卫普和伦敦的测量站FR04014、BETR801 和伦敦威斯敏斯特的值。 空气质量数据集包含以下列: city:使用传感器的城市,巴黎、安特卫普或伦敦 国家:使用传感器的国家,FR、BE 或 GB location:传感器的 ID,FR04014、BETR801或 伦敦威斯敏斯特 参数:传感器测量的参数,或者\(NO_2\) 或颗粒物 value:测量值 单位:测量参数的单位,在本例中为“μg/m³” 的索引DataFrame是datetime测量的日期时间。 笔记 空气质量数据以所谓的长格式 数据表示形式提供,每个观测值位于数据表的单独行中,每个变量位于数据表的单独列中。长/窄格式也称为整齐数据格式。 至原始数据 In [4]: air_quality = pd.read_csv( ...: "data/air_quality_long.csv", index_col="date.utc", parse_dates=True ...: ) ...: In [5]: air_quality.head() Out[5]: city country location parameter value unit date.utc 2019-06-18 06:00:00+00:00 Antwerpen BE BETR801 pm25 18.0 µg/m³ 2019-06-17 08:00:00+00:00 Antwerpen BE BETR801 pm25 6.5 µg/m³ 2019-06-17 07:00:00+00:00 Antwerpen BE BETR801 pm25 18.5 µg/m³ 2019-06-17 06:00:00+00:00 Antwerpen BE BETR801 pm25 16.0 µg/m³ 2019-06-17 05:00:00+00:00 Antwerpen BE BETR801 pm25 7.5 µg/m³ 如何重塑表格布局# 对表行进行排序# 我想根据乘客的年龄对泰坦尼克号数据进行排序。 In [6]: titanic.sort_values(by="Age").head() Out[6]: 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 [7]: titanic.sort_values(by=['Pclass', 'Age'], ascending=False).head() Out[7]: 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(),表中的行将根据定义的列进行排序。索引将遵循行顺序。 转至用户指南用户指南中有关数据排序的部分提供了有关表排序的更多详细信息。 长到宽的表格格式# 让我们使用空气质量数据集的一小部分。我们专注于 \(NO_2\)数据并仅使用每个位置的前两个测量值(即每个组的头部)。数据子集将被称为no2_subset。 # filter for no2 data only In [8]: no2 = air_quality[air_quality["parameter"] == "no2"] # use 2 measurements (head) for each location (groupby) In [9]: no2_subset = no2.sort_index().groupby(["location"]).head(2) In [10]: no2_subset Out[10]: 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] 我希望三个站点的值作为彼此相邻的单独列。 In [11]: no2_subset.pivot(columns="location", values="value") Out[11]: 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 [12]: no2.head() Out[12]: 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 [13]: no2.pivot(columns="location", values="value").plot() Out[13]: <Axes: xlabel='date.utc'> 笔记 index当未定义该参数时,将使用现有索引(行标签)。 转至用户指南有关更多信息,请参阅用户指南中有关旋转 DataFrame 对象的pivot()部分。 数据透视表# 我想要平均浓度\(NO_2\)和\(PM_{2.5}\)以表格形式在每个站中。 In [14]: air_quality.pivot_table( ....: values="value", index="location", columns="parameter", aggfunc="mean" ....: ) ....: Out[14]: parameter no2 pm25 location BETR801 26.950920 23.169492 FR04014 29.374284 NaN London Westminster 29.740050 13.443568 在 的情况下pivot(),仅重新排列数据。当需要聚合多个值时(在这种特定情况下,不同时间步上的值),pivot_table()可以使用,提供关于如何组合这些值的聚合函数(例如均值)。 数据透视表是电子表格软件中众所周知的概念。当对每个变量的行/列边距(小计)感兴趣时,请将参数设置margins为True: In [15]: air_quality.pivot_table( ....: values="value", ....: index="location", ....: columns="parameter", ....: aggfunc="mean", ....: margins=True, ....: ) ....: Out[15]: 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()的用户指南部分。 笔记 如果您想知道,pivot_table()确实直接链接到groupby().通过对parameter和进行分组可以得出相同的结果 location: air_quality.groupby(["parameter", "location"])[["value"]].mean() 转至用户指南 宽到长格式# 再次从上一节中创建的宽格式表开始,我们向DataFramewith添加一个新索引reset_index()。 In [16]: no2_pivoted = no2.pivot(columns="location", values="value").reset_index() In [17]: no2_pivoted.head() Out[17]: 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 我想收集所有空气质量\(NO_2\)单列测量(长格式)。 In [18]: no_2 = no2_pivoted.melt(id_vars="date.utc") In [19]: no_2.head() Out[19]: 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 pandas.melt()a 上的方法将DataFrame数据表从宽格式转换为长格式。列标题成为新创建的列中的变量名称。 解决方案是关于如何申请的简短版本pandas.melt()。该方法会将所有未提及的列合并id_vars为两列:包含列标题名称的列和包含值本身的列。后一列默认获取名称value。 pandas.melt()可以更详细地定义传递给的参数: In [20]: no_2 = no2_pivoted.melt( ....: id_vars="date.utc", ....: value_vars=["BETR801", "FR04014", "London Westminster"], ....: value_name="NO_2", ....: var_name="id_location", ....: ) ....: In [21]: no_2.head() Out[21]: 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 附加参数具有以下作用: value_vars定义将哪些列融合在一起 value_name为值列提供自定义列名,而不是默认列名value var_name为收集列标题名称的列提供自定义列名称。否则它采用索引名称或默认值variable 因此,参数value_name和var_name只是两个生成列的用户定义名称。要熔化的列由id_vars和定义value_vars。 转至用户指南pandas.melt()用户指南中有关通过熔体重塑的部分解释了从宽格式到长格式的转换。 记住 支持按一列或多列排序sort_values。 该pivot功能纯粹是数据的重组, pivot_table支持聚合。 pivot(长到宽格式)的相反是melt(宽到长格式)。 转至用户指南有关重塑和旋转的页面上的用户指南提供了完整的概述。