我有这个看起来像这样的数据框
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但融化但无济于事。
答案 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