如何使用pandas的melt函数保留首列值实现宽表转长表
pandas 基于melt实现指定规则宽表转长表
问题原因说明
你之前调用.pivot()方法无法得到预期结果,是因为pivot的核心作用是长表转宽表,和你当前需要的宽表转长表是逆向操作,方向不匹配。
实现步骤
- 首先明确转换规则:保留
ID列作为行关联标识,将原表中Alphabet、Unspecified: 1、Unspecified: 2三列的所有非空值,统一归集到新的Alphabet列下,空值直接丢弃。 - 完整可运行代码如下:
import pandas as pd import numpy as np # 构造原始示例数据 df = pd.DataFrame({ 'ID': [1, 2, 3, 4, 5, 6], 'Alphabet': ['A', 'B', 'C', 'D', 'E', 'F'], 'Unspecified: 1': ['G', np.nan, 'H', 'I', 'J', 'K'], 'Unspecified: 2': ['L', np.nan, np.nan, 'M', np.nan, 'O'] }) # 调用melt完成宽转长 df_long = df.melt( id_vars=['ID'], value_vars=['Alphabet', 'Unspecified: 1', 'Unspecified: 2'], value_name='Alphabet' ).dropna(subset=['Alphabet']) # 清理多余列、重置索引得到最终结果 df_long = df_long.drop(columns=['variable']).reset_index(drop=True)
结果验证
执行print(df_long)即可得到匹配需求的输出:
ID Alphabet 0 1 A 1 2 B 2 3 C 3 4 D 4 5 E 5 6 F 6 1 G 7 3 H 8 4 I 9 5 J 10 6 K 11 1 L 12 4 M 13 6 O
注:你给出的目标示例中最后一行索引重复写为11属于笔误,上述输出的值映射关系完全符合要求:每个ID对应的所有取值都已按行展开,无遗漏、无多余空值。
内容的提问来源于stack exchange,提问作者matheo_eo
相关产品推荐
相关产品推荐

