如何将小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
相关产品推荐
相关产品推荐

