Один из способов - объединить ваши данные Quarter_X в список. Затем разверните список серий с помощью numpy
/ itertools
в новом фрейме данных.
Это обычно более эффективно, чем методы stack
или groupby
. Обратите внимание, что результирующий индекс извлекается из родительской строки. Вам нужно будет переиндексировать по мере необходимости.
from itertools import chain
import numpy as np
df['Quarters'] = list(zip(df.Quarter_1, df.Quarter_2, df.Quarter_3))
lens = list(map(len, df.Quarters))
res = pd.DataFrame({'Deal': np.repeat(df.Deal, lens),
'Year': np.repeat(df.Year, lens),
'Quarter': list(chain.from_iterable(df.Quarters)),
'FinancialData': np.repeat(df.FinancialData, lens)})
print(res)
Deal FinancialData Quarter Year
h 1 120 1 1991
h 1 120 2 1991
h 1 120 3 1991
i 2 80 4 1992
i 2 80 5 1992
i 2 80 6 1992
j 3 100 7 1993
j 3 100 8 1993
j 3 100 9 1993
Для нескольких столбцов вышеуказанный метод может быть дорогим, но вы можете сделать:
res = pd.DataFrame({**{'Quarter': list(chain.from_iterable(df.Quarters))},
**{k: np.repeat(df[k], lens) for k in df if 'Quarter' not in k}})