题目
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。
如上图可以展示表格的变化过程
注意:
- 丢失的数据: 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