如何在Pandas MultiIndex中获取多个Time列索引并插入列?
嘿,这个问题我之前处理多级表头表格时也踩过坑!直接用df.columns.get_loc('Time')肯定不行,因为MultiIndex的列是元组形式的(比如('Stage 1', 'Time')),单拿'Time'去匹配找不到对应的索引。咱们一步步来解决:
第一步:获取所有「Time」列的索引/位置
首先,我们要先定位到所有二级表头是'Time'的列。可以用列表推导式遍历所有列,筛选出符合条件的:
import pandas as pd # 读取带两级表头的表格 df = pd.read_excel('myspreadsheet.xlsx', header=[0,1]) # 获取所有二级表头为'Time'的列的MultiIndex标签(比如[('Stage 1', 'Time'), ('Stage 2', 'Time'), ...]) time_col_labels = [col for col in df.columns if col[1] == 'Time'] # 如果需要列的位置索引(比如[1,4,7]这种格式),可以再转一步: time_col_positions = [df.columns.get_loc(col) for col in time_col_labels]
这样你就得到了两种格式的结果,完全不用硬编码「Stage #」,适配任意数量的Stage。
第二步:在每个「Time」列后插入新的10列
这里有个小坑:如果从前往后插入列,后面的列位置会因为前面插入而偏移,所以最好从后往前处理,或者用拆分拼接的方式更稳妥。
方法1:从后往前插入(适合小批量列)
假设你要插入的DataFrame叫new_df(包含10列数据),代码如下:
# 假设new_df是你要插入的10列,这里用示例数据代替(实际替换成你的真实数据) new_df = pd.DataFrame({f'Insert_Col_{i}': [1]*len(df) for i in range(10)}) # 从最后一个Time列的位置开始往前插,避免位置偏移 for pos in reversed(time_col_positions): # 逐个插入new_df的列,每插一列,位置+1(因为列数增加了) for insert_col in new_df.columns: df.insert(pos + 1, insert_col, new_df[insert_col]) pos += 1
方法2:拆分拼接(更高效,适合大量列)
如果new_df列数很多,拆分拼接的方式更清晰,也不会有位置偏移问题:
parts = [] current_start = 0 for pos in time_col_positions: # 把当前到Time列的部分切出来 parts.append(df.iloc[:, current_start:pos+1]) # 插入new_df的所有列 parts.append(new_df) # 更新起始位置为Time列的下一列 current_start = pos + 1 # 加上表格最后剩下的部分 parts.append(df.iloc[:, current_start:]) # 拼接所有部分得到最终表格 df_final = pd.concat(parts, axis=1)
验证结果
你可以用print(df_final.columns)查看新的列结构,确认每个'Time'列后面都跟上了插入的10列。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

