You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现表格转置:将原列名作为值、唯一单元格值设为新列名

如何实现表格转置:将原列名作为值、唯一单元格值设为新列名

嗨,我来帮你搞定这个表格重塑的问题!你想要的其实是把宽表转成稀疏的「列转行」结构,刚好我有个靠谱的方法,一步步来:

第一步:先还原你的原始数据

首先咱们先把你给出的表格转换成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')

原始表格长这样:

IndexFirst DaySecond DayThird Day
0-MondayTuesday
1FridaySaturdaySunday
2SundayMonday-
3TuesdayWednesday-
4ThursdayFridaySaturday

第二步:用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、-)存到这个列
)

转完的窄表会是这样的结构(截取前几行):

IndexDay_TypeDay
0First Day-
1First DayFriday
2First DaySunday
0Second DayMonday
1Second DaySaturday

第三步:用pivot生成稀疏目标表

现在我们把Day作为新的列名,Index作为行索引,Day_Type作为填充值,最后把空值替换成你想要的--------:

# 执行pivot重塑表格,填充空值
result_df = melted_df.pivot(
    index='Index',
    columns='Day',
    values='Day_Type'
).fillna('--------')

最终结果

这样生成的表格就完全符合你的需求了,比如截取前3行的样子:

Index-MondayTuesdayWednesdayThursdayFridaySaturdaySunday
0First DaySecond DayThird Day----------------------------------------
1----------------------------------------First DaySecond DayThird Day
2Third DaySecond 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 10:17:59