2889. 数据重塑:透视 - 力扣(LeetCode)
题目
DataFrame weather
+-------------+--------+
| Column Name | Type |
+-------------+--------+
| city | object |
| month | object |
| temperature | int |
+-------------+--------+
编写一个解决方案,以便将数据 旋转,使得每一行代表特定月份的温度,而每个城市都是一个单独的列。
输出结果格式如下示例所示。
示例 1:
输入:
+--------------+----------+-------------+
| city | month | temperature |
+--------------+----------+-------------+
| Jacksonville | January | 13 |
| Jacksonville | February | 23 |
| Jacksonville | March | 38 |
| Jacksonville | April | 5 |
| Jacksonville | May | 34 |
| ElPaso | January | 20 |
| ElPaso | February | 6 |
| ElPaso | March | 26 |
| ElPaso | April | 2 |
| ElPaso | May | 43 |
+--------------+----------+-------------+
输出:
+----------+--------+--------------+
| month | ElPaso | Jacksonville |
+----------+--------+--------------+
| April | 2 | 5 |
| February | 6 | 23 |
| January | 20 | 13 |
| March | 26 | 38 |
| May | 43 | 34 |
+----------+--------+--------------+
解释:
表格被旋转,每一列代表一个城市,每一行代表特定的月份。
思路
- 首先使用pd的pivot函数将行索引变成month,列索引变成city,值用temperature填充。
- 但是这样的结果因为是多维索引,所以列名表示会有问题?查询多方无果,但是打印了一下发现列名其实是对的,所以又用列名更新了一下自己,竟然就对了(很迷惑)。
代码实现
import pandas as pddef pivotTable(weather: pd.DataFrame) -> pd.DataFrame:pt = pd.pivot(weather, values="temperature", index="month", columns="city")return pt
知识积累
- df数据透视表:
- df.pivot(index, columns, values)
- index:指定一列作为索引,如果没有指定则用原来的索引。
- columns:指定一列的值作为列名。
- values:指定一列作为生成的对象的值,如果置空,那么剩余的列将会形成列的多层索引,虽然不该变透视表的列名,但是展示出来的列名是异常的(第一层是未出现的列名,第二层是columns的列)。
- df.pivot_table(index, columns, values, aggfunc, ...)——pivot方法要求不能出先行列索引重复的情况,即若行列索引相同时,应该进行数据聚合,那么就得使用这个方法。
- 主要参数和上面都一样,但是index必须指定。
- aggfunc:聚合函数,如果出现重复的行列索引的数据怎么做聚合,默认为"mean"。
- df.pivot(index, columns, values)
官方题解
- 原来是用df的pivot函数,但是必须指定values,不然就会将未包含的列加入多层索引中。
- 复现:
-
import pandas as pddef pivotTable(weather: pd.DataFrame) -> pd.DataFrame:pt = weather.pivot(index="month", columns="city", values="temperature")return pt