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

如何将Pandas中读取的交叉表转换为长格式?

解决Pandas宽表转长表问题

你的问题核心是初始DataFrame的表头结构异常——实际列名被存放在第一行数据中,而非真正的列名位置,导致pd.wide_to_long()和pd.stack()无法正常工作。按以下步骤处理即可:

步骤1:修复DataFrame的表头结构

假设读取Excel后得到的DataFrame名为df,先将第一行数据设为列名,再截取有效数据行:

# 将第一行设为列名
df.columns = df.iloc[0]
# 从第二行开始取有效数据,重置索引
df = df.iloc[1:].reset_index(drop=True)

处理后,DataFrame会变为正常的宽格式:

row_name col_a      col_b      col_c      col_d      col_e
0  label_1   0.3  0.106628494  0.049496617  0.029875719  0.029444018
1  label_2   0.4  0.287788288  0.016961146  0.014512181  0.012937216
2  label_3   0.5  0.428264132  0.317066974  0.046346238  0.005149056
3  label_4   0.6  0.176474306  0.134044892   0.12476623   0.062386211
4  label_5   0.7  0.015996073   0.00574499  0.005136634   0.000789726

步骤2:用melt转换为长格式

使用Pandas的melt方法,指定保留的行标识列,以及目标长格式的列名:

# 转换为长格式
long_df = df.melt(
    id_vars='row_name',
    var_name='col_name',
    value_name='value'
)

# 可选:将value列转为数值类型(避免读取后为字符串格式)
long_df['value'] = pd.to_numeric(long_df['value'])

最终得到的long_df就是你需要的长格式结构:

row_name col_name      value
0    label_1    col_a  0.3000000
1    label_2    col_a  0.4000000
2    label_3    col_a  0.5000000
3    label_4    col_a  0.6000000
4    label_5    col_a  0.7000000
5    label_1    col_b  0.1066285
6    label_2    col_b  0.2877883
7    label_3    col_b  0.4282641
8    label_4    col_b  0.1764743
9    label_5    col_b  0.0159961
...

内容的提问来源于stack exchange,提问作者J. Jenkins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:23:07