如何用Python Pandas将Excel父列拆分为下方两个子列
解决Pandas拆分Excel列并保持对应位置的问题
原代码的问题分析
- 拆分分隔符错误:使用
str.split()时未指定分隔符,默认按空格拆分「12-->23」会得到['12', '-->', '23'],此时取new_cols[1]拿到的是箭头而非目标数值; - 列顺序混乱:循环中把新列全部追加到DataFrame末尾,删除原列后所有子列堆在一起,无法对应到原列的位置。
方法一:生成带前缀的单层子列(保持原列顺序)
这种方法会将每个原列拆分为原列名_pre和原列名_post,并严格按照原列的顺序排列子列:
import pandas as pd # 读取Excel文件 df = pd.read_excel('path/to/excel_file.xlsx') # 存储新列的顺序 new_col_order = [] for col in df.columns: # 按-->拆分,同时处理箭头前后的空格,生成两列 split_result = df[col].str.split(r'\s*-->\s*', expand=True) # 给拆分后的列命名 split_result.columns = [f"{col}_pre", f"{col}_post"] # 将拆分后的列合并到原DataFrame df = pd.concat([df, split_result], axis=1) # 记录新列顺序 new_col_order.extend([f"{col}_pre", f"{col}_post"]) # 删除原列 df.drop(col, axis=1, inplace=True) # 按原列对应的子列顺序重新排列 df = df[new_col_order] # 可选:保存结果到新Excel df.to_excel('split_result.xlsx', index=False)
方法二:生成多层表头(完全匹配你的期望输出)
如果需要让子列「pre」「post」位于原列名正下方(即多层表头结构),可以用以下代码:
import pandas as pd df = pd.read_excel('path/to/excel_file.xlsx') result_df = pd.DataFrame() for col in df.columns: # 拆分列并处理空格 split_cols = df[col].str.split(r'\s*-->\s*', expand=True) # 设置多层表头:上层是原列名,下层是pre/post split_cols.columns = pd.MultiIndex.from_tuples([(col, 'pre'), (col, 'post')]) # 合并到结果DataFrame result_df = pd.concat([result_df, split_cols], axis=1) # 保存结果,多层表头会被保留 result_df.to_excel('split_result_multi_header.xlsx', index=False)
运行后,生成的Excel表头会是两层:第一层是原列名,第二层对应「pre」和「post」,完全符合你给出的期望输出格式。
内容的提问来源于stack exchange,提问作者kritika
相关产品推荐
相关产品推荐

