如何用Python的pandas库函数透视数据表让数据的显示更清晰

82 阅读2分钟

题目

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           |
+----------+--------+--------------+
解释:
表格被旋转,每一列代表一个城市,每一行代表特定的月份。

解题方案

1、审题,理解题意

题目的意思是有DataFrame表行显示城市的的月份和温度,希望将表旋转使得每一行代表特定月份的温度,而每个城市都是一个单独的列。此时可以用pandas 中 pivot 函数对列的值重塑数据并且在外部得到一个新的 DataFrame

pivot 函数的参数介绍:
  • index: 确定新 DataFrame 中的行。
  • columns: 确定新 DataFrame 中的列。
  • values: 指定重塑表格时要使用的值。

2、解题思路

我们一步步通过代码来实现该需求:

1、导入 pandas:

import pandas as pd

2、pivot 函数

ans = weather.pivot(index='month', columns='city', values='temperature')

下面是 pivot 函数中的每个参数执行的操作:

  • index:它确定新 DataFrame 中的行。在本例中,我们使用原始 DataFrame 中的 month 列作为索引,这意味着我们的透视表将为 month 列中的每个唯一值都建立行。
  • columns:它确定新 DataFrame 中的列。在这里,我们使用的是 city 列,这意味着我们的透视表将有一列对应于 city 列中的每个唯一值。
  • values:此参数指定重塑表格时要使用的值。在本例中,我们使用原始 DataFrame 中的 temperature 列。

3、返回修改后的 DataFrame:

return ans            #这行代码返回透视后的 DataFrame。

image.png

如上图可以展示表格的变化过程

注意:

  • 丢失的数据: pivot 函数不处理相同索引/列组合的重复条目。如果有重复的条目,可以考虑使用 pivot_table,它可以聚合重复的条目。
  • 数据类型: 对于每个给定的表,city 和 month 列是 object 数据类型,相当于 pandas 中的字符串型,而 temperature 是整型。
  • 顺序: 输出不一定与示例中的顺序相同(即从 1 月到 5 月)。如果您想要按特定顺序排列,则必须在透视后对其进行排序。

3、代码实现

import pandas as pd

def pivotTable(weather: pd.DataFrame) -> pd.DataFrame:
    ans = weather.pivot(index='month', columns='city', values='temperature')
    return ans

4、执行结果

image-20231025113634195