如何对含重复列名的行切片并按顺序堆叠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
相关产品推荐
相关产品推荐

