如何用Python的pandas库函数重塑自己需要的表格格式

67 阅读3分钟

题目

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 被重塑为所需的长格式,最终实现的效果如下图所示:

    image.png

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

4、执行结果

image-20231025115101596