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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:35:13