如何用单步操作熔解MultiIndex DataFrame的单个列层级?
一步熔解MultiIndex DataFrame列层级的方法
我正在处理一个带MultiIndex列的DataFrame,想要熔解其中一个列层级。目前已找到两步实现的方法,想了解是否可通过单次调用df.melt(**kwargs)或其他函数一步达成预期结果。
示例DataFrame
import pandas as pd import datetime import numpy as np cols = pd.MultiIndex.from_tuples( [ ('A', 'temp_avg'), ('A', 'temp_predicted'), ('B', 'temp_avg'), ('B', 'temp_predicted'), ], names=['location', 'name'] # 给列层级命名会让后续操作更清晰 ) df = pd.DataFrame( np.random.randn(4,4), columns=cols, index=pd.date_range( datetime.datetime(2013,1,1), datetime.datetime(2013,1,4), ) ) df.index.names=['date']
当前两步解决方案
df_melt = df.reset_index().melt( id_vars=[('date', "")], var_name=['location', 'name'], ).rename({('date', ''): 'date'}, axis=1) df_desired = df_melt.pivot_table( index=['date', 'location'], columns='name', values='value', )
一步实现方法
方法1:stack+unstack(推荐)
这是pandas处理MultiIndex最原生高效的方式,直接通过层级重塑得到目标结果:
# 给列层级命名后,可直接用名称指定层级,代码更易读 df_desired = df.stack('location').unstack('name')
如果没给列层级命名,也可以用层级索引(0代表第一层级):
df_desired = df.stack(level=0).unstack(level=1)
方法2:链式调用melt+pivot
如果坚持用melt,可以通过链式调用把两步逻辑合并为一行代码:
df_desired = ( df.reset_index() .melt(id_vars='date', var_name=['location', 'name']) .pivot(index=['date', 'location'], columns='name', values='value') .rename_axis(None, axis=1) # 可选操作:移除列索引的名称 )
两种方法得到的结果和你原来两步实现的df_desired完全一致,其中stack+unstack的方式更贴合MultiIndex的设计逻辑,代码更简洁且性能更优。
内容的提问来源于stack exchange,提问作者dg141
相关产品推荐
相关产品推荐

