如何在不重复子列名的情况下移位Pandas多索引列?
多级列索引DataFrame批量添加移位列的解决方法
场景复现
构造带多级列索引的DataFrame:
import pandas as pd P = pd.DataFrame( [[100, 101], [101, 102], [ 98, 99]], columns=pd.MultiIndex.from_tuples( [('price', 'bid'), ('price', 'ask')] ) )
尝试直接添加显示上一行数据的列时:
P['price_prev'] = P['price'].shift(1)
触发错误:
ValueError: Cannot set a DataFrame with multiple columns to the single column price_prev
已知手动指定完整列元组可实现需求,但这种方式需要重复子列名,不够高效:
P[[('price_prev', 'bid'), ('price_prev', 'ask')]] = P['price'].shift(1)
简洁解决方案
无需重复子列名,可通过修改移位后数据的列索引,再合并到原DataFrame:
方案1:批量重命名列索引后合并
# 获取移位后的数据 shifted_data = P['price'].shift(1) # 重新构造多级列索引,将顶层列名改为'price_prev' shifted_data.columns = pd.MultiIndex.from_tuples( [('price_prev', sub_col) for sub_col in shifted_data.columns] ) # 合并到原DataFrame P = pd.concat([P, shifted_data], axis=1)
方案2:用rename简化列索引修改
P = pd.concat( [P, P['price'].shift(1).rename(columns=lambda sub_col: ('price_prev', sub_col))], axis=1 )
执行后,原DataFrame会新增price_prev顶层列,包含bid和ask子列,数据为对应price列的上一行值,效果与手动指定列名完全一致,但无需重复输入子列名。
内容的提问来源于stack exchange,提问作者Mophotla
相关产品推荐
相关产品推荐

