如何用Pandas合并列?如何将指定列上下合并并调整位置?
Pandas实现每3列一组上下合并并按组排列的解决方案
我来帮你搞定这个Pandas列合并的问题!从你的描述来看,你需要把数据按每3列分成一组,每组内的列上下堆叠成单个新列,然后将这些新列按分组顺序从左到右排列(第一组合并列在最左侧,依次类推)。你的现有代码逻辑没对齐这个需求,我先帮你分析问题,再给出正确的实现代码。
现有代码的问题分析
你的代码有几个关键逻辑错误,导致结果不符合预期:
- 循环中每次用
pd.concat([file1, x], ignore_index=True)是把原始完整数据和当前组的3列上下拼接,这完全不是“组内列合并”的逻辑,反而会不断扩大数据行数,最后只保留最后一次循环的错误结果。 list = [0,3,3,3]的分组步进逻辑混乱,虽然第一次能取到前3列,但后续的索引计算没有正确对应分组,而且没有把每组的3列合并成单个列。- 没有处理合并后列的排列顺序,完全没实现“每组合并列置于左侧,依次排列”的需求。
正确实现代码及解释
下面是符合你需求的代码,我会逐段解释逻辑:
import pandas as pd # 读取Excel文件,注意index_col=None避免自动设置索引,sheet_name指定工作表 file_path = "C:\\Myfile.xlsx" df = pd.read_excel(file_path, sheet_name="Sheet1", index_col=None) # 计算分组:每3列一组,确保列数是3的倍数(如果有剩余列可以根据需求调整) total_cols = df.shape[1] group_size = 3 n_groups = total_cols // group_size # 存储每个组合并后的列 merged_columns = [] for i in range(n_groups): # 获取当前组的3列:从i*3到(i+1)*3的列 group_cols = df.iloc[:, i*group_size : (i+1)*group_size] # 将组内的3列上下合并成一个新列(ignore_index=True重置行索引) merged_col = pd.concat([group_cols.iloc[:, col] for col in range(group_size)], ignore_index=True) # 给合并后的列命名,方便识别 merged_col.name = f"Merged_Group_{i+1}" merged_columns.append(merged_col) # 将所有合并后的列拼接成最终的DataFrame final_df = pd.concat(merged_columns, axis=1) # 保存到新的Excel文件 final_df.to_excel("C:\\Myfile_new.xlsx", index=False)
代码逻辑详解
- 数据读取:使用
index_col=None确保读取数据时不会把第一列当作索引,避免后续切片混乱。 - 分组计算:根据总列数和每组3列的规则,计算需要分成多少组。如果你的数据列数不是3的倍数,可以在
n_groups后加上判断,处理剩余的列(比如单独合并剩余列)。 - 组内列合并:对每组的3列,通过
pd.concat把每一列的内容依次上下堆叠,形成单个新列,同时重置行索引保证连续。 - 列拼接:把所有合并后的新列按分组顺序(从左到右)拼接成最终的DataFrame,正好满足你“每组合并列置于左侧,依次排列”的需求。
- 保存结果:将最终数据保存到新Excel文件,
index=False避免输出额外的索引列。
示例验证
假设你的初始数据是这样的(6列,分成2组):
| Col0 | Col1 | Col2 | Col3 | Col4 | Col5 |
|---|---|---|---|---|---|
| A1 | B1 | C1 | D1 | E1 | F1 |
| A2 | B2 | C2 | D2 | E2 | F2 |
运行代码后,最终结果会是:
| Merged_Group_1 | Merged_Group_2 |
|---|---|
| A1 | D1 |
| A2 | D2 |
| B1 | E1 |
| B2 | E2 |
| C1 | F1 |
| C2 | F2 |
完全符合你“每3列合并置于左侧,下一组3列合并紧随其后”的需求。
内容的提问来源于stack exchange,提问作者C.J1990
相关产品推荐
相关产品推荐

