如何用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列值存在笔误,上述为修正后的合理结果,若需严格匹配原输出可忽略此修正)
你的代码问题
你当前的代码有两个核心问题:
- 每次循环都直接用新切片覆盖
dfnew,没有做数据追加操作; 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
相关产品推荐
相关产品推荐

