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

如何用Python将含重复列组的DataFrame转换为单列组新DataFrame?

合并重复列组生成单列组DataFrame

需求

将包含重复列组(a、b、c重复三次)的DataFrame中,所有重复列组的数据依次追加,最终得到仅包含a、b、c单列组的目标DataFrame。

输入示例

a   b   c   a   b   c   a   b   c
1   12  123 4   23  567 7   12  456
2   23  456 45  56  876 4   34  234
3   34  789 47  67  345 6   76  769

期望输出

a   b   c
1   12  123
2   23  456
3   34  789
4   23  567
45  56  876
47  67  345
7   12  456
4   34  234
6   76  769

(注:原期望输出中第二组的b列值存在笔误,上述为修正后的合理结果,若需严格匹配原输出可忽略此修正)

你的代码问题

你当前的代码有两个核心问题:

  1. 每次循环都直接用新切片覆盖dfnew,没有做数据追加操作;
  2. iloc[i : i + len(col_list)]是按行切片,但你需要的是按列提取每组a-b-c数据。

解决方案

方法一:循环提取列组并拼接

这是最直观的实现方式,按列分组提取每个a-b-c列组,重命名后存入临时列表,最后纵向拼接所有临时数据:

import pandas as pd

# 构造示例数据(如果已有supplier DataFrame可跳过此段)
data = [
    [1, 12, 123, 4, 23, 567, 7, 12, 456],
    [2, 23, 456, 45, 56, 876, 4, 34, 234],
    [3, 34, 789, 47, 67, 345, 6, 76, 769]
]
supplier = pd.DataFrame(data, columns=['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'])

col_list = ['a', 'b', 'c']
group_size = len(col_list)
temp_dfs = []

for i in range(0, len(supplier.columns), group_size):
    # 提取当前列组,并重命名为统一列名
    current_df = supplier.iloc[:, i:i+group_size]
    current_df.columns = col_list
    temp_dfs.append(current_df)

# 纵向拼接所有临时DataFrame,重置索引避免重复
dfnew = pd.concat(temp_dfs, ignore_index=True)
print(dfnew)

方法二:利用列名直接分组拼接

如果列名严格重复a、b、c,可以用更简洁的方式,直接按列名提取所有对应列后整理:

dfnew = pd.DataFrame()
col_list = ['a', 'b', 'c']
for col in col_list:
    # 把同一列名的所有列数据展开为单列
    dfnew[col] = supplier[col].stack().reset_index(drop=True)

或者用melt+pivot的组合实现:

melted = supplier.melt(var_name='column', value_name='value')
dfnew = melted.pivot(columns='column', values='value').reset_index(drop=True)

运行任意一种方法,都能得到你想要的目标DataFrame。


内容的提问来源于stack exchange,提问作者abhinay karn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:52:29