У меня есть два отдельных фрейма данных, представляющих разные типы данных, основанных на времени. Один содержит сотни тысяч временных меток, разбросанных по нескольким месяцам. Этот кадр данных имеет столбцы, представляющие месяц года, время суток и измеренную температуру. Второй кадр данных состоит из замещающих температур для каждой комбинации месяц/час. Данные выглядят примерно так:
df1
Временная метка | Месяц | Час | Температура |
---|---|---|---|
01.01.2021 00:00:00 | 1 | 0 | 10 |
01.01.2021 00:00:05 | 1 | 0 | 11 |
01.01.2021 00:00:07 | 1 | 0 | 8 |
01.01.2021 00:00:15 | 1 | 0 | 12 |
01.01.2021 00:01:00 | 1 | 1 | 13 |
и т.д.
df2
Час | Янв | февраль | март | апр | и т.д. |
---|---|---|---|---|---|
0 | 9 | 12 | 10 | 12 | и т.д. |
1 | 10 | 11 | 14 | 15 | и т.д. |
2 | 8 | 7 | 12 | 16 | и т.д. |
df2 содержит строку для каждого часа дня и столбец для каждого месяца года (в реальном наборе данных месяцы являются числовыми, я написал названия, чтобы сделать описание более понятным).
Мне нужно сопоставить данные, содержащиеся за месяц/час в df2, со столбцом Temperature в df 1. Таким образом, df1 после редактирования должен выглядеть следующим образом.
Новый df1
Временная метка | Месяц | Час | Температура |
---|---|---|---|
01.01.2021 00:00:00 | 1 | 0 | 9 |
01.01.2021 00:00:05 | 1 | 0 | 9 |
01.01.2021 00:00:07 | 1 | 0 | 9 |
01.01.2021 00:00:15 | 1 | 0 | 9 |
01.01.2021 00:01:00 | 1 | 1 | 10 |
Я заставил его работать, используя вложенный цикл for, следующим образом:
for month in df2.columns:
for hour in df2.index:
dT = df2.loc[hour, month]
df1.loc[(df1['Month'] == month) & (df1['Hour'] == hour), 'Temperature'] = dT
Вложенный цикл for перебирает все месяцы и часы в df2, находит ячейки в df1 с соответствующими месяцем и часом, затем устанавливает температуру, равную температуре, считанной из df2.
Но этот код сложно читать и очень медленно выполнять. Кто-нибудь знает лучший способ??
Спасибо!
Можете ли вы проверить мой ответ и дать мне отзыв о времени работы? Можно сделать это быстрее, пропустив шаг по извлечению названия месяца и вместо этого переработав второй фрейм данных. Дай мне знать…