跳至主要內容

2889. 数据重塑:透视


2889. 数据重塑:透视

🟢   🔗 力扣open in new window LeetCodeopen in new window

题目

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)来对数据进行分组和聚合。
  1. 设置行索引 (index)
    • 使用 'month' 列作为透视表的行索引,每一行表示一个月份。
  2. 设置列索引 (columns)
    • 使用 'city' 列作为透视表的列索引,每一列表示一个城市。
  3. 设置值 (values)
    • 使用 'temperature' 列作为需要聚合的值。
  4. 指定聚合函数 (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')