如何填充含多层索引列的Pandas DataFrame?
批量填充多层索引列DataFrame的方法
我通过以下代码创建了带多层索引列(MultiIndex)的空DataFrame:
import pandas as pd trans = ['Scale Up', 'Scale Down', 'U'] sources = ['P1', 'P2'] cols = ['date', 'sec'] index = pd.MultiIndex.from_product([trans, sources, cols]) df = pd.DataFrame(columns=index)
目标是基于另一个DataFrame new_positions,批量填充每个(trans, source)组合对应的date和sec列。单组筛选逻辑示例:
my_data = new_positions.loc[((new_positions['trans']=='Scale Up') & (new_positions['source'] == 'P1'))].sort_values(['score']).tail(10)[['date', 'sec']].copy()
需要实现对所有(trans, source)组合的批量填充,无需逐个手动处理。
高效批量填充方案
利用groupby分组处理+列结构对齐的方式,避免手动循环,代码更简洁高效:
# 按trans和source分组,每组内执行排序、取最后10条数据的操作 grouped_data = new_positions.groupby(['trans', 'source']).apply( lambda group: group.sort_values('score').tail(10)[['date', 'sec']].reset_index(drop=True) ) # 调整分组结果的列结构,与目标df的MultiIndex列对齐 aligned_data = grouped_data.unstack(level=[0, 1]).swaplevel(0, 1, axis=1).sort_index(axis=1) # 批量填充到目标df df.loc[:aligned_data.shape[0]-1, :] = aligned_data.values
关键步骤说明
- 分组处理:通过
groupby(['trans', 'source'])匹配目标df的前两层索引,每组内执行业务逻辑(排序取top10),确保输出数据对应目标列组。 - 结构对齐:
unstack将行索引转为列索引,swaplevel调整层级顺序,最终列结构与目标df的MultiIndex完全一致。 - 批量赋值:直接将对齐后的数据赋值到目标df的对应行,完成所有列组的填充。
补全空行(可选)
如果部分分组数据不足10条,需要补全空行确保每组都占10行,可修改apply内的逻辑:
lambda group: group.sort_values('score').tail(10)[['date', 'sec']].reset_index(drop=True).reindex(range(10))
内容的提问来源于stack exchange,提问作者Triki Sadok
相关产品推荐
相关产品推荐

