如何使用Pandas的transpose、pivot、stack/unstack转换年周维度表格
表格转换实现方案
原始数据
| | Public transport | Public transport.1 | Taxis | Taxis.1 | | ---- | ---------------- | ------------------ | ----- | ------- | | year | 2019 | 2020 | 2019 | 2020 | | W1 | 100.0 | 91.3 | 100.0 | 102.1 | | W2 | 91.1 | 96.6 | 98.3 | 88.3 |
目标格式
| year | week | Public transport | Taxis | | ---- | ---- | ---------------- | ----- | | 2019 | W1 | 100.0 | 100.0 | | | W2 | 91.1 | 98.3 | | 2020 | W1 | 91.3 | 102.1 | | | W2 | 96.6 | 88.3 |
用Pandas实现转换(含transpose/stack/unstack操作)
直接用这些操作组合就能搞定,步骤如下:
1. 构造原始DataFrame
先把表格数据导入Pandas:
import pandas as pd data = { 'Public transport': ['2019', 100.0, 91.1], 'Public transport.1': ['2020', 91.3, 96.6], 'Taxis': ['2019', 100.0, 98.3], 'Taxis.1': ['2020', 102.1, 88.3] } df = pd.DataFrame(data, index=['year', 'W1', 'W2'])
2. 转置表格(transpose)
转置后让年份和类别成为行索引,方便后续拆分:
df_t = df.T
3. 拆分列名提取年份
列名里的.1对应2020,无后缀对应2019,拆分后补全年份值:
df_t[['category', 'year']] = df_t.index.str.split('.', expand=True) df_t['year'] = df_t['year'].fillna('2019') # 无后缀的列默认对应2019
4. 堆叠周数(stack)
把W1、W2这两列堆叠成行,得到长格式数据:
df_stacked = df_t.set_index(['category', 'year']).stack().reset_index() df_stacked.columns = ['category', 'year', 'week', 'value']
5. 拆堆得到宽格式(unstack)
把category列拆成目标里的两列,再处理year列的重复值:
df_final = df_stacked.set_index(['year', 'week', 'category'])['value'].unstack().reset_index() # 把重复的year值设为空,和目标格式一致 df_final['year'] = df_final['year'].where(df_final['year'] != df_final['year'].shift(), '')
最终结果
打印df_final就会得到你要的表格格式:
| year | week | Public transport | Taxis | | ---- | ---- | ---------------- | ----- | | 2019 | W1 | 100.0 | 100.0 | | | W2 | 91.1 | 98.3 | | 2020 | W1 | 91.3 | 102.1 | | | W2 | 96.6 | 88.3 |
内容的提问来源于stack exchange,提问作者Alex Günsberg
相关产品推荐
相关产品推荐

