如何用Pandas将宽格式DataFrame转换为s_id关联c_id的长格式?
Pandas实现行转列(宽表转长表)
针对你需要将包含s_id和多个分类ID列的DataFrame转换为长表结构的需求,可以使用Pandas的melt()函数快速实现,以下是具体步骤:
1. 构造示例数据
首先还原你提供的示例DataFrame:
import pandas as pd df = pd.DataFrame({ 's_id': [1, 2, 3], 'c1_id': ['a', 'a', 'x'], 'c2_id': ['b', 'b', 'y'], 'c3_id': ['c', None, 'z'] })
2. 执行转换操作
使用melt()函数将宽表转为长表,再过滤空值并整理结构:
# 转换宽表为长表,指定s_id为标识列,c*_id为待转换的列 melted = pd.melt( df, id_vars=['s_id'], # 保持不变的列 value_vars=['c1_id', 'c2_id', 'c3_id'], # 需要转换的列 value_name='c_id' # 新值列的名称 ) # 过滤空值,移除多余的variable列,最后排序并重置索引 result = melted.dropna(subset=['c_id']).drop(columns='variable') result = result.sort_values('s_id').reset_index(drop=True) print(result)
3. 输出结果
执行后得到的DataFrame与你需求的结构完全一致:
s_id c_id 0 1 a 1 1 b 2 1 c 3 2 a 4 2 b 5 3 x 6 3 y 7 3 z
关键说明
pd.melt()是Pandas中处理宽表转长表的核心函数,能高效将多列合并为单列,同时保留关联的标识列。dropna(subset=['c_id'])用于过滤原数据中存在的空值(比如s_id=2对应的c3_id为空),避免生成无效行。- 最后排序和重置索引是为了让结果更规整,与示例输出的顺序一致。
内容的提问来源于stack exchange,提问作者aristotle29
相关产品推荐
相关产品推荐

