拼接列索引结构不匹配的DataFrame:添加单行小表数据
合并大型多层列DataFrame与单行DataFrame的实现方案
数据准备
先根据提供的数据源构造两个目标DataFrame:
import pandas as pd # 构造大型多层列DataFrame large_df_data = { ('TC2_37', 'value'): {'Aug 23': 20339.0, 'Sep 23': 19737.0, 'Oct 23': 19821.0, 'Nov 23': 20803.0, 'Dec 23': 22070.0, 'Q3 23': 18158.0, 'Q4 23': 20899.0, 'Q1 24': 16361.0, 'Q2 24': 14581.0, 'Q3 24': 13029.0, 'Q4 24': 16701.0, 'Cal 24': 15168.0, 'Cal 25': 13950.0}, ('TC2_37', 'daily_change'): {'Aug 23': 4018.0, 'Sep 23': 3037.0, 'Oct 23': 1316.0, 'Nov 23': 580.0, 'Dec 23': 115.0, 'Q3 23': 1891.0, 'Q4 23': 672.0, 'Q1 24': 363.0, 'Q2 24': 380.0, 'Q3 24': 415.0, 'Q4 24': 310.0, 'Cal 24': 367.0, 'Cal 25': 98.0}, ('TD25', 'value'): {'Aug 23': 26569.0, 'Sep 23': 32725.0, 'Oct 23': 38033.0, 'Nov 23': 40282.0, 'Dec 23': 42195.0, 'Q3 23': 31269.0, 'Q4 23': 40170.0, 'Q1 24': 37983.0, 'Q2 24': 28731.0, 'Q3 24': 27840.0, 'Q4 24': 33390.0, 'Cal 24': 31986.0, 'Cal 25': 30712.0}, ('TD25', 'daily_change'): {'Aug 23': -951.0, 'Sep 23': -507.0, 'Oct 23': -18.0, 'Nov 23': -188.0, 'Dec 23': -148.0, 'Q3 23': -1102.0, 'Q4 23': -117.0, 'Q1 24': -125.0, 'Q2 24': 546.0, 'Q3 24': 628.0, 'Q4 24': 520.0, 'Cal 24': 393.0, 'Cal 25': 139.0} } large_df = pd.DataFrame(large_df_data) # 构造单行小型DataFrame small_df_data = { 'A6TCE': [17134.0], 'BCTI': [720.0], 'BDTI': [821.0], 'MA2TCE': [28859.0], 'TD7': [9917.0], 'TD8': [31700.0], 'TD25': [10408.0], 'V2TCE': [11800.0], 'TC2_37': [990.0] } small_df = pd.DataFrame(small_df_data, index=['2023-08-02'])
核心实现步骤
1. 筛选重叠的route列
找出两个DataFrame共有的route列:
# 获取大型DataFrame的第一层列(route名称) large_routes = large_df.columns.get_level_values(0).unique() # 获取小型DataFrame的列名 small_routes = small_df.columns # 取两者的交集 common_routes = large_routes.intersection(small_routes)
2. 转换小型DataFrame为多层列结构
将小型DataFrame调整为与大型DataFrame一致的多层列格式,仅填充value子列,daily_change子列留空:
# 构造匹配大型DataFrame的多层列索引 new_small_columns = pd.MultiIndex.from_product([common_routes, ['value', 'daily_change']]) # 创建空的多层列DataFrame small_df_multi = pd.DataFrame(index=small_df.index, columns=new_small_columns) # 填充value子列的数据 for route in common_routes: small_df_multi[(route, 'value')] = small_df[route]
3. 合并两个DataFrame
将处理后的小型DataFrame放在大型DataFrame的最前面:
# 纵向合并两个DataFrame combined_df = pd.concat([small_df_multi, large_df], axis=0) # 保持索引名称与原数据一致 combined_df.index.name = 'period'
验证结果
输出合并后的DataFrame,结构与需求完全匹配:
print(combined_df)
输出示例(部分列):
TC2_37 TD25 value daily_change value daily_change period 2023-08-02 990.0 NaN 10408.0 NaN Aug 23 20339.0 4018.0 26569.0 -951.0 Sep 23 19737.0 3037.0 32725.0 -507.0 Oct 23 19821.0 1316.0 38033.0 -18.0 ... ... ... ... ... Cal 25 13950.0 98.0 30712.0 139.0
内容的提问来源于stack exchange,提问作者neutralname
相关产品推荐
相关产品推荐

