2018-09-14_wide_to_long.ipynb
values = [['1978-09-13 0:00', 'someValue', 106.34, 'someValue', 'someValue'],
['1978-09-14 0:00', 'someValue', 105.1, 'someValue', 'someValue'],
['1978-09-15 0:00', 'someValue', 104.12, 'someValue', 'someValue'],
['1978-09-18 0:00', 'someValue', 103.21, 'someValue', 'someValue'],
['1978-09-19 0:00', 'someValue', 102.53, 'someValue', 'someValue'],
['1978-09-20 0:00', 'someValue', 101.73, 'someValue', 'someValue'],
['1978-09-21 0:00', 'someValue', 101.9, 'someValue', 'someValue'],
['1978-09-22 0:00', 'someValue', 101.84, 'someValue', 'someValue'],
['1978-09-25 0:00', 'someValue', 101.86, 'someValue', 'someValue'],
['1978-09-26 0:00', 'someValue', 102.62, 'someValue', 'someValue'],
['1978-09-27 0:00', 'someValue', 101.66, 'someValue', 'someValue']]
headers = ['Date', 'S&PCOMP(PO)', 'S&PCOMP(PI)', 'NASA100(PO)', 'NASA100(PI)']
df = pd.DataFrame(values, columns=headers)
, если вы можете изменить заголовки - следующий цикл создает новые заголовки (новые заголовкине кодируются вручную):
headers_new = {}
for x in list(df.columns):
headers_new[x] = x[-4:] + x[:-4]
headers_new
- это выход предыдущего цикла.
headers_new =
{'Date': 'Date',
'S&PCOMP(PO)': '(PO)S&PCOMP',
'S&PCOMP(PI)': '(PI)S&PCOMP',
'NASA100(PO)': '(PO)NASA100',
'NASA100(PI)': '(PI)NASA100'}
df = df.rename(index=str, columns=headers_new)
, тогда вы можете:
df_long = pd.wide_to_long(df, ['(PO)', '(PI)'], i='Date', j='stock', suffix=r'(?<=\))(.*)')
Пожалуйста, не забудьте проверить принятое решение.Наслаждайтесь!
(PO) (PI)
Date stock
1978-09-13 0:00 S&PCOMP someValue 106.34
1978-09-14 0:00 S&PCOMP someValue 105.1
1978-09-15 0:00 S&PCOMP someValue 104.12
1978-09-18 0:00 S&PCOMP someValue 103.21
1978-09-19 0:00 S&PCOMP someValue 102.53
1978-09-20 0:00 S&PCOMP someValue 101.73
1978-09-21 0:00 S&PCOMP someValue 101.9
1978-09-22 0:00 S&PCOMP someValue 101.84
1978-09-25 0:00 S&PCOMP someValue 101.86
1978-09-26 0:00 S&PCOMP someValue 102.62
1978-09-27 0:00 S&PCOMP someValue 101.66
1978-09-13 0:00 NASA100 someValue someValue
1978-09-14 0:00 NASA100 someValue someValue
Индексирование
df.columns =
Index(['(PO)', '(PI)'], dtype='object')
df.loc[('1978-09-25 0:00')] =
(PO) (PI)
stock
S&PCOMP someValue 101.86
NASA100 someValue someValue
df.loc[('1978-09-25 0:00', 'S&PCOMP')] =
(PO) someValue
(PI) 101.86
Name: (1978-09-25 0:00, S&PCOMP), dtype: object
or you can reset the index:
df2 = df.reset_index()
df2.columns =
Index(['Date', 'stock', '(PO)', '(PI)'], dtype='object')
df2.iloc[:3]
Date stock (PO) (PI)
0 1978-09-13 0:00 S&PCOMP someValue 106.34
1 1978-09-14 0:00 S&PCOMP someValue 105.1
2 1978-09-15 0:00 S&PCOMP someValue 104.12