Skip to main content
 首页 » 编程设计

python之具有多索引列的 Pandas 中棘手的宽到长转换

2025年05月04日14wuhuacong

我有一个看起来像的数据框

stock  date         type1 type2 volume_A qtit_A volume_B qtit_B 
'ABC' '2013-01-01'  1     2     1000     5      2500     6 
'ABC' '2013-01-02'  1     3     4000     10     2500     0 

我想按如下方式 reshape 它:

stock  date         type1 type2 volume qtit type 
'ABC' '2013-01-01'  1     2     1000     5   A     
'ABC' '2013-01-01'  1     2     2500     6   B    
'ABC' '2013-01-02'  1     3     4000     10  A  
'ABC' '2013-01-02'  1     3     2500     0   B    

您可以在其中看到 ['volume_A','qtit_A','volume_B','qtit_B'] 列在 ['volume','qtit'] 中分割 带有类型指示符以记住我们正在查看的交易量/价格类型。

我正在努力以干净的方式在 Pandas 中完成这项工作(例如使用 melt 或 stack())

有什么想法吗? 谢谢!

请您参考如下方法:

如果将 ['date','stock','type1','type2'] 设置为 index,则可以拆分剩余的列标签'_',从这些元组中创建一个 MultiIndex,然后将 A、B 标签移动到 index 中使用 堆栈。 reset_index 然后通过将索引级别移回到列中来生成所需的结果。

import pandas as pd 
 
df = pd.DataFrame({'date': ['2013-01-01', '2013-01-02'], 
 'qtit_A': [5, 10], 
 'qtit_B': [6, 0], 
 'stock': ['ABC', 'ABC'], 
 'type1': [1, 1], 
 'type2': [2, 3], 
 'volume_A': [1000, 4000], 
 'volume_B': [2500, 2500]}) 
 
df = df.set_index(['date','stock','type1','type2']) 
df.columns = pd.MultiIndex.from_tuples([col.split('_', 1) for col in df.columns]) 
result = df.stack(level=1).reset_index() 
result = result.rename(columns={'level_4':'type'}) 
print(result) 

产量:

         date stock  type1  type2 type  qtit  volume 
0  2013-01-01   ABC      1      2    A     5    1000 
1  2013-01-01   ABC      1      2    B     6    2500 
2  2013-01-02   ABC      1      3    A    10    4000 
3  2013-01-02   ABC      1      3    B     0    2500