Практически все, что вы просите, это " un-pivot ", ваш DataFrame. Общий способ решения этих типов проблем заключается в использовании некоторой версии melt
, stack
или unstack
. Вот подход, использующий stack
.
Настройка
df = pd.DataFrame({'year': {0: 1998, 1: 1998, 2: 1998, 3: 1998, 4: 1998, 5: 2001}, 'month': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 5}, '1': {0: 2.5, 1: 2.5, 2: 2.5, 3: 2.5, 4: 2.5, 5: 2.5}, '2': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1}, '3': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '4': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '5': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '6': {0: 2.5, 1: 4.5, 2: 3.5, 3: 8.5, 4: 1.5, 5: 1.5}, '7': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '8': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '9': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '10': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '11': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '12': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '13': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '14': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, '15': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}})
Использование stack
:
out = df.set_index(['year', 'month']).stack().reset_index()
pd.DataFrame({
'Date': pd.to_datetime(out.iloc[:, :3].astype(str).agg('-'.join, 1)),
'Value': out.iloc[:, 3]
})
Date Value
0 1998-01-01 2.5
1 1998-01-02 1
2 1998-01-03 -
3 1998-01-04 -
4 1998-01-05 -
5 1998-01-06 2.5
.. ... ...
60 1998-05-01 2.5
61 1998-05-02 1
83 2001-05-09 -
84 2001-05-10 -
85 2001-05-11 -
86 2001-05-12 -
87 2001-05-13 -
88 2001-05-14 -
89 2001-05-15 -