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

如何将小DataFrame的行插入到带MultiIndex的大DataFrame匹配行前?

问题描述

我有一个小DataFrame和一个带MultiIndex的大DataFrame,需要在不改变大DataFrame原有顺序的前提下,为每个shortCode将小DataFrame中的spot行插入到大DataFrame对应组的顶部。

小DataFrame

WS      period shortCode identifier
6        197.78  2023-03-10   TC2-FFA       spot
7        196.79  2023-03-10   TC5-FFA       spot
8        253.13  2023-03-10   TC6-FFA       spot
9        198.13  2023-03-13  TC12-FFA       spot
10       166.67  2023-03-10  TC14-FFA       spot
11       217.86  2023-03-10  TC17-FFA       spot
18        97.00  2023-03-10   TD3-FFA       spot
19       172.19  2023-03-10   TD7-FFA       spot
20       205.71  2023-03-13   TD8-FFA       spot
21       175.63  2023-03-10  TD19-FFA       spot
22       115.45  2023-03-10  TD20-FFA       spot
23  11350000.00  2023-03-10  TD22-FFA       spot
24       232.14  2023-03-10  TD25-FFA       spot

带MultiIndex的大DataFrame

datumUnit                      $/mt       WS
identifier period shortCode                 
TC2BALMO   Mar 23 TC2-FFA    39.376  228.930
TC2CURMON  Mar 23 TC2-FFA    35.946  208.988
TC2+1_M    Apr 23 TC2-FFA    38.444  223.512
TC2+2_M    May 23 TC2-FFA    37.786  219.686
TC2+3_M    Jun 23 TC2-FFA    36.613  212.866
                            ...      ...
TD25+3Q    Q4 23  TD25-FFA   42.909  185.432
TD25+4Q    Q1 24  TD25-FFA   39.000      NaN
TD25+5Q    Q2 24  TD25-FFA   32.421      NaN
TD25+1CAL  Cal 24 TD25-FFA   34.250      NaN
TD25+2CAL  Cal 25 TD25-FFA   33.955      NaN

其MultiIndex结构:

MultiIndex([( 'TC2BALMO', 'Mar 23',  'TC2-FFA'),
            ('TC2CURMON', 'Mar 23',  'TC2-FFA'),
            (  'TC2+1_M', 'Apr 23',  'TC2-FFA'),
                  ...
            (  'TD25+4Q',  'Q1 24', 'TD25-FFA'),
            (  'TD25+5Q',  'Q2 24', 'TD25-FFA'),
            ('TD25+1CAL', 'Cal 24', 'TD25-FFA'),
            ('TD25+2CAL', 'Cal 25', 'TD25-FFA')],
           names=['identifier', 'period', 'shortCode'], length=198)

预期结果是每个shortCode组顶部插入对应的spot行,保持大DataFrame原有的组内顺序。

解决方案

可以通过以下步骤实现:

步骤1:预处理小DataFrame

调整小DataFrame的列顺序、格式,设置与大DataFrame一致的MultiIndex,并补充缺失的$/mt列:

import pandas as pd

# 转换period格式(2023-03-10 → 23-03-10)
small_df['period'] = small_df['period'].str.replace('20', '', regex=False)
# 补充缺失的$/mt列
small_df['$/mt'] = pd.NA
# 调整列顺序与大DataFrame对齐
small_df = small_df[['identifier', 'period', 'shortCode', '$/mt', 'WS']]
# 设置与大DataFrame一致的MultiIndex
small_df = small_df.set_index(['identifier', 'period', 'shortCode'])

步骤2:分组处理大DataFrame

按shortCode分组,对每个组插入对应的spot行,最后合并所有组:

# 存储处理后的分组数据
processed_groups = []

# 按shortCode遍历大DataFrame的分组
for short_code, group in large_df.groupby('shortCode', group_keys=False):
    # 获取当前shortCode对应的spot行
    spot_row = small_df.xs(short_code, level='shortCode', drop_level=False)
    # 将spot行插入到当前组的顶部
    combined_group = pd.concat([spot_row, group])
    processed_groups.append(combined_group)

# 合并所有处理后的分组,得到最终结果
final_df = pd.concat(processed_groups)

补充说明

  • 上述代码会严格保留大DataFrame中每个shortCode组的原有内部顺序,仅在组顶部插入对应的spot行。
  • 如果小DataFrame中存在大DataFrame没有的shortCode,对应的spot行不会被插入;若需要保留这些行,可以在最后将其追加到final_df中。

内容的提问来源于stack exchange,提问作者neutralname

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:34:56