无索引情况下pd.DataFrame.melt的反向操作是什么?
嘿,这个问题问得很到位!pd.DataFrame.melt()的反向操作,最常用的就是**pivot()方法——如果你的数据里没有重复的索引+列组合,用它就足够了;要是存在重复项,那pivot_table()**会是更稳妥的选择。
我给你搭个具体的示例场景,对应你说的从df2还原回原始df的需求:
首先假设我们的原始宽表df是这样的:
import pandas as pd df = pd.DataFrame({ 'Name': ['Alice', 'Bob', 'Charlie'], 'Math': [85, 90, 78], 'English': [92, 88, 85], 'Science': [79, 81, 93] })
经过melt操作后得到窄表df2:
df2 = df.melt(id_vars='Name', var_name='Subject', value_name='Score')
现在要从df2还原回原始的宽表,用pivot()就可以搞定:
# 用pivot反向还原 restored_df = df2.pivot( index='Name', # 对应melt时的id_vars columns='Subject', # 对应melt时的var_name values='Score' # 对应melt时的value_name ).reset_index() # 去掉columns的名称,让结构和原始df完全一致 restored_df.columns.name = None
要是你的df2里存在同一Name+Subject对应多个Score的情况,pivot()会直接报错,这时候就换pivot_table(),还能指定聚合方式处理重复值:
# 处理重复值的情况,这里用均值作为聚合示例 restored_df = df2.pivot_table( index='Name', columns='Subject', values='Score', aggfunc='mean' # 可以换成sum、first等其他聚合函数 ).reset_index() restored_df.columns.name = None
简单来说,melt是把宽表转窄,pivot/pivot_table就是把窄表转宽,完美对应反向操作~
内容的提问来源于stack exchange,提问作者Pepacz
相关产品推荐
相关产品推荐

