题目
DataFrame report
+-------------+--------+
| Column Name | Type |
+-------------+--------+
| product | object |
| quarter_1 | int |
| quarter_2 | int |
| quarter_3 | int |
| quarter_4 | int |
+-------------+--------+
编写一个解决方案,将数据 重塑 成每一行表示特定季度产品销售数据的形式。
结果格式如下例所示:
示例 1:
输入:
+-------------+-----------+-----------+-----------+-----------+
| product | quarter_1 | quarter_2 | quarter_3 | quarter_4 |
+-------------+-----------+-----------+-----------+-----------+
| Umbrella | 417 | 224 | 379 | 611 |
| SleepingBag | 800 | 936 | 93 | 875 |
+-------------+-----------+-----------+-----------+-----------+
输出:
+-------------+-----------+-------+
| product | quarter | sales |
+-------------+-----------+-------+
| Umbrella | quarter_1 | 417 |
| SleepingBag | quarter_1 | 800 |
| Umbrella | quarter_2 | 224 |
| SleepingBag | quarter_2 | 936 |
| Umbrella | quarter_3 | 379 |
| SleepingBag | quarter_3 | 93 |
| Umbrella | quarter_4 | 611 |
| SleepingBag | quarter_4 | 875 |
+-------------+-----------+-------+
解释:
DataFrame 已从宽格式重塑为长格式。每一行表示一个季度内产品的销售情况。
解题方案
1、审题,理解题意
题目的意思是重塑一个给定的 DataFrame,该 DataFrame 捕获不同季度的产品销售数据。最初,数据是以宽格式组织的,其中每个产品都有单独的列表示每个季度的销售额。任务是将此数据转换为长格式,其中每一行表示特定产品在特定季度的销售数据,从而有效地将多个季度列合并为两列:一列指示该季度,另一列详细说明该季度的销售额。此时可以用 pandas 的 melt 函数用于转换或重塑数据。它将 DataFrame 从宽格式(列表示多个变量)更改为长格式(每行表示一个唯一变量)。
melt 函数参数定义:
- id_vars:这指定了应该保持不变的列。对于这个问题,只有 product 列保持不变,因为我们希望输出中的每一行都与一个产品相关联。
- value_vars:这指定了我们想要“melt”或将其整形成行的列。在我们的示例中,以下是每个季度的销售数据列:quarter_1、quarter_2、quarter_3 和 quarter_4。
- var_name:这是将存储来自 value_vars 的标头名称的新列的名称。在我们的问题中,这些是季度名称。
- value_name:这是将存储 value_vars 中的值的新列的名称。在我们的问题中,这将是每个季度每种产品的销售数据。
2、解题思路
针对该题目,我们可以使用如下方法实现:
-
id_vars=['product'] 保持 product 列不变。
-
value_vars=['quarter_1', 'quarter_2', 'quarter_3', 'quarter_4'] 意味着我们将从这些列中提取数据,并将其重塑为两个新列。
-
var_name='quarter' 将创建一个名为 quarter 的新列,此列中的每个条目都将是从中获取销售数据的列名 (比如 quarter_1,quarter_2 和其它)。
-
value_name='sales' 将创建一个叫做 sales 的新列,它将存储实际的销售价值。 通过应用 melt 函数,DataFrame 被重塑为所需的长格式,最终实现的效果如下图所示:
3、代码实现
import pandas as pd
def meltTable(report: pd.DataFrame) -> pd.DataFrame:
report = report.melt(
id_vars=["product"],
value_vars=["quarter_1", "quarter_2", "quarter_3", "quarter_4"],
var_name="quarter",
value_name="sales",
)
return report