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

如何对含重复列名的行切片并按顺序堆叠DataFrame行?

解决DataFrame重复列名切片堆叠与转多行问题

先理清楚你的需求,我先基于你给出的信息构造一个贴近场景的示例DataFrame(因为你提供的行3数据不完整,我补全后方便演示):

假设你的原始DataFrame是带有重复列名的宽表,结构如下:

import pandas as pd

# 构造含重复列名的示例DataFrame
data = {
    'RESP': [46, 46],
    'HR': [122, 122],
    'SPO2': [0, 0],
    'PULSE': [0, 0],
    'RESP': [4, 5],
    'HR': [90, 95],
    'SPO2': [92, 94],
    'PULSE': [88, 90]
}
df = pd.DataFrame(data)

这个DataFrame的列名是['RESP', 'HR', 'SPO2', 'PULSE', 'RESP', 'HR', 'SPO2', 'PULSE'],存在重复列名,接下来分别解决你的两个问题:


1. 对重复列名的行切片并按顺序堆叠

我们需要把每一组重复的列(比如第一组RESP-HR-SPO2-PULSE、第二组RESP-HR-SPO2-PULSE)分别切片,再按顺序堆叠成新的DataFrame:

# 获取所有唯一的列名
unique_cols = df.columns.unique()

# 初始化空DataFrame存储结果
stacked_result = pd.DataFrame()

# 遍历每一组重复列,切片后堆叠
for col_group in unique_cols:
    # 切片出当前列名对应的所有列
    slice_df = df[col_group]
    # 给切片后的列重命名为唯一列名(避免重复)
    slice_df.columns = unique_cols
    # 重置索引,保证堆叠后顺序连续
    slice_df = slice_df.reset_index(drop=True)
    # 拼接到结果中
    stacked_result = pd.concat([stacked_result, slice_df], ignore_index=True)

执行后,stacked_result就是按顺序堆叠后的结果,原来的每组重复列都变成了独立的行,顺序和原始列的分组顺序一致。


2. 将DataFrame转换为多行且保留原有顺序

这里的核心是把宽表转成长格式,同时严格保留原始数据的顺序。可以用两种方法实现:

方法1:使用stack()方法

stack()会自动按行和列的顺序转换,适合快速转长表:

# 转换为长格式,保留原始顺序
long_df = df.stack().reset_index()
# 重命名列,让结果更清晰
long_df.columns = ['原始行索引', '指标名称', '指标值']
# 按原始行索引排序,确保顺序不变
long_df = long_df.sort_values('原始行索引', ignore_index=True)

方法2:使用melt()方法

如果需要更灵活的控制(比如保留行标识),可以用melt():

# 给每行添加唯一标识,用于后续排序
df['行ID'] = df.index
# 转换为长格式
long_df = pd.melt(df, id_vars='行ID', var_name='指标名称', value_name='指标值')
# 按行ID排序,严格保留原始顺序
long_df = long_df.sort_values('行ID', ignore_index=True)

如果你的原始DataFrame是另一种场景(比如行内数据是按列名组拆分的字符串),可以用以下方式处理:

假设你的DataFrame是每行存储一组RESP-HR-SPO2-PULSE的字符串:

df = pd.DataFrame({
    '数据': ['46 122 0 0', '46 122 0 0', '4 90 92 88']
})

转换为多行的代码:

# 拆分每行的字符串为多列
split_df = df['数据'].str.split(expand=True)
# 给列命名为对应的指标
split_df.columns = ['RESP', 'HR', 'SPO2', 'PULSE']
# 转换为数值类型(可选,根据你的需求)
split_df = split_df.apply(pd.to_numeric)

这样得到的split_df就是多行结构,顺序和原始行完全一致。

内容的提问来源于stack exchange,提问作者Syed Najam Ul Hasan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:54:38