You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何填充含多层索引列的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

关键步骤说明

  1. 分组处理:通过groupby(['trans', 'source'])匹配目标df的前两层索引,每组内执行业务逻辑(排序取top10),确保输出数据对应目标列组。
  2. 结构对齐:unstack将行索引转为列索引,swaplevel调整层级顺序,最终列结构与目标df的MultiIndex完全一致。
  3. 批量赋值:直接将对齐后的数据赋值到目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:50:26