我有一个看起来像的数据框
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
