如何将Pandas DataFrame中固定列后的重复列数据移至新行?
Pandas重复列组转多行解决方案
现有一个仅含2行但包含多组重复列(如A、B、C、D重复出现)的DataFrame,需要将每一组重复列转换为新行,实现行列结构的重组。
示例输入
A B C D A B C D hel 1 3 5 9 1 3 5 8 good 1 6 5 8 2 4 5 8
期望输出
A B C D hel 1 3 5 9 good 1 6 5 8 hel 1 3 5 8 good 2 4 5 8
核心思路
按固定列数(每组列的数量,比如这里是4)将原DataFrame拆分为多个子DataFrame,再将这些子DataFrame纵向拼接,即可实现列组转多行的效果。
代码实现
import pandas as pd # 构造示例DataFrame(模拟重复列场景) df = pd.DataFrame( [[1, 3, 5, 9, 1, 3, 5, 8], [1, 6, 5, 8, 2, 4, 5, 8]], index=['hel', 'good'], columns=['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D'] ) # 定义每组的列数(根据实际场景调整) group_col_count = 4 # 按列位置拆分出所有列组对应的子DataFrame sub_dfs = [df.iloc[:, i:i+group_col_count] for i in range(0, len(df.columns), group_col_count)] # 统一所有子DataFrame的列名(避免重复列名导致的后缀问题) for sub_df in sub_dfs: sub_df.columns = ['A', 'B', 'C', 'D'] # 替换为实际的组列名 # 纵向拼接所有子DataFrame,得到最终结果 result_df = pd.concat(sub_dfs, axis=0) print(result_df)
代码说明
iloc[:, i:i+group_col_count]:通过列位置切片拆分,不受重复列名自动加后缀的影响,适用于列组连续重复的场景。- 统一列名:确保每个子DataFrame的列名一致,保证拼接后结构正确。
pd.concat(sub_dfs, axis=0):将多个子DataFrame按行堆叠,保留原索引,实现列组到多行的转换。
拓展场景
如果列组不是连续重复,而是按列名分散排列(比如所有A列在一起,所有B列在一起),可以改用按列名分组的方式:
# 获取唯一列名 unique_columns = df.columns.unique() # 提取每列的所有数据并转成行 column_dfs = [] for col in unique_columns: col_series = df[col].stack().reset_index(level=1, drop=True) column_dfs.append(col_series) # 合并为最终DataFrame result_df = pd.concat(column_dfs, axis=1) result_df.columns = unique_columns
内容的提问来源于stack exchange,提问作者bernando_vialli
相关产品推荐
相关产品推荐

