2889. 数据重塑:透视
2889. 数据重塑:透视
题目
DataFrame weather
+-------------+--------+ | Column Name | Type | +-------------+--------+ | city | object | | month | object | | temperature | int | +-------------+--------+
Write a solution to pivot the data so that each row represents temperatures for a specific month, and each city is a separate column.
The result format is in the following example.
Example 1:
Input:
+--------------+----------+-------------+ | 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 | +--------------+----------+-------------+
Output:
+----------+--------+--------------+ | month | ElPaso | Jacksonville | +----------+--------+--------------+ | April | 2 | 5 | | February | 6 | 23 | | January | 20 | 13 | | March | 26 | 38 | | May | 43 | 34 | +----------+--------+--------------+
Explanation: The table is pivoted, each column represents a city, and each row represents a specific month.
题目大意
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 | +----------+--------+--------------+
解释: 表格被旋转,每一列代表一个城市,每一行代表特定的月份。
解题思路
- 在 Pandas 中,可以使用
pivot_table()
方法对数据进行透视,重新组织 DataFrame。 - 透视表通过指定行(
index
)、列(columns
)、值(values
)和聚合函数(aggfunc
)来对数据进行分组和聚合。
- 设置行索引 (
index
):- 使用
'month'
列作为透视表的行索引,每一行表示一个月份。
- 使用
- 设置列索引 (
columns
):- 使用
'city'
列作为透视表的列索引,每一列表示一个城市。
- 使用
- 设置值 (
values
):- 使用
'temperature'
列作为需要聚合的值。
- 使用
- 指定聚合函数 (
aggfunc
):- 使用
max
聚合函数,表示计算每个月每个城市的最高温度。
- 使用
- 返回的是一个透视后的 DataFrame,其中行表示月份,列表示城市,值为每个城市在对应月份的最高温度。
复杂度分析
- 时间复杂度:
O(n)
,其中n
是 DataFrame 的行数。pivot_table()
需要遍历数据以分组并计算聚合值。 - 空间复杂度:
O(m * c)
,其中m
是唯一的month
数量,c
是唯一的city
数量,需要为生成的透视表分配内存。
代码
import pandas as pd
def pivotTable(weather: pd.DataFrame) -> pd.DataFrame:
return weather.pivot_table(index='month', columns='city', values='temperature', aggfunc='max')