2016-08-15 61 views
0

我有一个数据帧,看起来像整蛊宽,在大熊猫长转换多索引列

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 

,我想如下重塑它:

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']分解与类型指标,以记住我们正在查看哪种类型的价格/价格。

我很努力在大熊猫是在做一个干净的方式(使用meltstack()例如)

任何想法? 谢谢!

回答

2

如果设置['date','stock','type1','type2']index,那么你就可以在'_'分割剩余的列标签,从这些元组创建一个多指标,然后使用stackAB标签迁入indexreset_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 
3
pd.lreshape(df.assign(type_A=['A']*len(df), type_B=['B']*len(df)), 
      {'volume': ['volume_A', 'volume_B'], 
      'qtit': ['qtit_A', 'qtit_B'], 
      'type': ['type_A', 'type_B']}) 
Out: 
      date stock type1 type2 qtit type volume 
0 '2013-01-01' 'ABC'  1  2  5 A 1000 
1 '2013-01-02' 'ABC'  1  3 10 A 4000 
2 '2013-01-01' 'ABC'  1  2  6 B 2500 
3 '2013-01-02' 'ABC'  1  3  0 B 2500 

考虑到根据列表的顺序对输出进行排序,可能不需要分配两个新的列类型。

+1

感谢艾汉,但到底是什么'lreshape' ??? :D你在哪里找到它 –

+2

我认为unutbu找到它:)(见答案[here](http://stackoverflow.com/a/35483228/2285236))。我第一次在jezrael的答案中看到了它。你可以输入pd.lreshape? *限*文件。 – ayhan

+0

哈哈这是一个伟大的捕获,但我们可以安全地假设该功能行为正确吗?实验可能意味着无处不在支持=错误? –