如何实现表格转置:将原列名作为值、唯一单元格值设为新列名
如何实现表格转置:将原列名作为值、唯一单元格值设为新列名
嗨,我来帮你搞定这个表格重塑的问题!你想要的其实是把宽表转成稀疏的「列转行」结构,刚好我有个靠谱的方法,一步步来:
第一步:先还原你的原始数据
首先咱们先把你给出的表格转换成Pandas DataFrame,方便后续操作:
import pandas as pd # 构造原始数据 data = { 'Index': [0, 1, 2, 3, 4], 'First Day': ['-', 'Friday', 'Sunday', 'Tuesday', 'Thursday'], 'Second Day': ['Monday', 'Saturday', 'Monday', 'Wednesday', 'Friday'], 'Third Day': ['Tuesday', 'Sunday', '-', '-', 'Saturday'] } df = pd.DataFrame(data).set_index('Index')
原始表格长这样:
| Index | First Day | Second Day | Third Day |
|---|---|---|---|
| 0 | - | Monday | Tuesday |
| 1 | Friday | Saturday | Sunday |
| 2 | Sunday | Monday | - |
| 3 | Tuesday | Wednesday | - |
| 4 | Thursday | Friday | Saturday |
第二步:用melt把宽表转成窄表
要实现你的需求,第一步得把原来的宽表(多列)转成窄表(两列存类型和值),这一步用melt就很方便:
# 先把索引转成普通列,再执行melt melted_df = df.reset_index().melt( id_vars='Index', # 保留Index作为标识列 var_name='Day_Type', # 原列名(First/Second/Third Day)存到这个列 value_name='Day' # 原单元格的值(比如Monday、-)存到这个列 )
转完的窄表会是这样的结构(截取前几行):
| Index | Day_Type | Day |
|---|---|---|
| 0 | First Day | - |
| 1 | First Day | Friday |
| 2 | First Day | Sunday |
| 0 | Second Day | Monday |
| 1 | Second Day | Saturday |
第三步:用pivot生成稀疏目标表
现在我们把Day作为新的列名,Index作为行索引,Day_Type作为填充值,最后把空值替换成你想要的--------:
# 执行pivot重塑表格,填充空值 result_df = melted_df.pivot( index='Index', columns='Day', values='Day_Type' ).fillna('--------')
最终结果
这样生成的表格就完全符合你的需求了,比如截取前3行的样子:
| Index | - | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday |
|---|---|---|---|---|---|---|---|---|
| 0 | First Day | Second Day | Third Day | -------- | -------- | -------- | -------- | -------- |
| 1 | -------- | -------- | -------- | -------- | -------- | First Day | Second Day | Third Day |
| 2 | Third Day | Second Day | -------- | -------- | -------- | -------- | -------- | First Day |
为什么你之前的方法不行?
你用的df.pivot_table(index=df.index, columns=df.values, values=df.columns)有个问题:df.values是整个表格的二维数值数组,pivot_table的columns参数需要传入列名,而不是直接传入表格的所有值,所以这个写法不符合Pandas的API要求,自然跑不通啦。
备注:内容来源于stack exchange,提问作者mikemike
相关产品推荐
相关产品推荐

