Как объединить все столбцы данных в один столбец? - PullRequest
1 голос
/ 09 февраля 2020

У меня есть кадр данных, который выглядит примерно так:

           2020-01-01   2020-01-02   2020-01-03   2020-01-05
00:00:00     11             47          54           10 
01:00:00     12             49          46           22
...
23:00:00     15             34          22           40

Ожидаемый результат ...

2020-01-01 00:00:00   11
2020-01-01 01:00:00   12
...
2020-01-01 23:00:00   12
2020-01-02 00:00:00   47
2020-01-02 01:00:00   49
...
2020-01-01 23:00:00   34
...

1 Ответ

4 голосов
/ 09 февраля 2020

Используйте DataFrame.melt с преобразованием индекса в столбец, затем преобразуйте столбцы в datetime и timedeltas и объедините вместе с DataFrame.pop для извлечения столбцов:

df = df.reset_index().melt('index')
df.index = pd.to_datetime(df.pop('variable')) + pd.to_timedelta(df.pop('index'))

#alternative with join strings
#df.index = pd.to_datetime(df.pop('variable') + ' ' + df.pop('index'))
print (df)
                     value
2020-01-01 00:00:00     11
2020-01-01 01:00:00     12
2020-01-01 23:00:00     15
2020-01-02 00:00:00     47
2020-01-02 01:00:00     49
2020-01-02 23:00:00     34
2020-01-03 00:00:00     54
2020-01-03 01:00:00     46
2020-01-03 23:00:00     22
2020-01-05 00:00:00     10
2020-01-05 01:00:00     22
2020-01-05 23:00:00     40

Если pop не используется, необходимо удалить столбцы на DataFrame.drop:

df = df.reset_index().melt('index')
df.index = pd.to_datetime(df['variable']) + pd.to_timedelta(df['index'])
df = df.drop(['index','variable'], axis=1)

Еще одна идея с DataFrame.unstack и присоединиться MultiIndex с map и преобразовать в DatetimeIndex, вывод Series:

s = df.unstack()
s.index = pd.to_datetime(s.index.map('{0[0]} {0[1]}'.format))
print (s)
2020-01-01 00:00:00    11
2020-01-01 01:00:00    12
2020-01-01 23:00:00    15
2020-01-02 00:00:00    47
2020-01-02 01:00:00    49
2020-01-02 23:00:00    34
2020-01-03 00:00:00    54
2020-01-03 01:00:00    46
2020-01-03 23:00:00    22
2020-01-05 00:00:00    10
2020-01-05 01:00:00    22
2020-01-05 23:00:00    40
dtype: int64
...