重塑数据帧(从长到长)

时间:2018-03-22 02:09:42

标签: python pandas

我有这个看起来像这样的数据框

df = pd.DataFrame(
    [[2, 4, 'ABC', '01Jan2017', '01Jul2016', '01Jul2017', 0.5, 0.3, 0.7],
     [9, 2, 'DEF', '01Jan2017', '01Jul2016', '01Jul2017', 0.5, 0.3, 0.7]],
    columns=[
        'SEDOL', 'ISIN', 'INSTRUMENT',
        'DT_TRANSACTED', 'DT_SIX_MTHS_BEF', 'DT_SIX_MTHS_AFT',
        'PX_TRANSACTED', 'PX_SIX_MONTHS_BEF', 'PX_SIX_MONTHS_AFT']
)

如何将每行分成3行,每行包含每个属性(' SEDOL',' ISIN'' INSTRUMENT') dt和px列重新形成。理想情况下,每行应分成如下结构:

SEDOL, ISIN, INSTRUMENT, DT_TRANSACTED, PX_TRANSACTED 
SEDOL, ISIN, INSTRUMENT, DT_SIX_MTHS_BEF, PX_SIX_MONTHS_BEF 
SEDOL, ISIN, INSTRUMENT, DT_SIX_MTHS_AFT, PX_SIX_MONTHS_AFT 

我尝试过wide_to_long但融化但无济于事。

1 个答案:

答案 0 :(得分:2)

您需要使用filter分解数据并使用concat将其加入。

df = df.set_index(['SEDOL', 'ISIN', 'INSTRUMENT']).sort_index()
i = df.filter(like='DT_')
j = df.filter(like='PX_')

df = pd.concat([
       i.stack().reset_index(level=-1), 
       j.stack().reset_index(level=-1)
    ], 
    axis=1
)
df.columns = ['DT_Var', 'DT_Val', 'PX_Var', 'PX_Val']

                                DT_Var     DT_Val             PX_Var  PX_Val
SEDOL ISIN INSTRUMENT                                                       
2     4    ABC           DT_TRANSACTED  01Jan2017      PX_TRANSACTED     0.5
           ABC         DT_SIX_MTHS_BEF  01Jul2016  PX_SIX_MONTHS_BEF     0.3
           ABC         DT_SIX_MTHS_AFT  01Jul2017  PX_SIX_MONTHS_AFT     0.7
9     2    DEF           DT_TRANSACTED  01Jan2017      PX_TRANSACTED     0.5
           DEF         DT_SIX_MTHS_BEF  01Jul2016  PX_SIX_MONTHS_BEF     0.3
           DEF         DT_SIX_MTHS_AFT  01Jul2017  PX_SIX_MONTHS_AFT     0.7