Как назначить значения столбцу данных, сравнивая значения в другом кадре - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть два кадра данных. У каждого есть строки на каждые пять минут в день:

df

         TIMESTAMP              TEMP
1        2011-06-01 00:05:00    24.5
200      2011-06-01 16:40:00    32.0
1000     2011-06-04 11:20:00    30.2
5000     2011-06-18 08:40:00    28.4
10000    2011-07-05 17:20:00    39.4
15000    2011-07-23 02:00:00    29.3
20000    2011-08-09 10:40:00    29.5
30656    2011-09-15 10:40:00    13.8

У меня есть другой фрейм данных, который занимает дни

ranked

      TEMP    DATE          RANK
62    43.3    2011-08-02    1.0
63    43.1    2011-08-03    2.0
65    43.1    2011-08-05    3.0
38    43.0    2011-07-09    4.0
66    42.8    2011-08-06    5.0
64    42.5    2011-08-04    6.0
84    42.2    2011-08-24    7.0
56    42.1    2011-07-27    8.0
61    42.1    2011-08-01    9.0
68    42.0    2011-08-08    10.0

Оба столбца TIMESTAMP и DATE являются типами данных datetime (dtype возвращает dtype('M8[ns]').

Что я хочу сделать, это добавить столбец в фрейм данных df, а затем поставить ранг строки на основе TIMESTAMP и соответствующего ранга дня с ranked (то есть за день все 5-минутные временные шаги будут иметь одинаковый ранг).

Итак, конечный результат будет выглядеть примерно так:

df

         TIMESTAMP              TEMP    RANK
1        2011-06-01 00:05:00    24.5    98.0
200      2011-06-01 16:40:00    32.0    98.0
1000     2011-06-04 11:20:00    30.2    96.0
5000     2011-06-18 08:40:00    28.4    50.0
10000    2011-07-05 17:20:00    39.4    9.0
15000    2011-07-23 02:00:00    29.3    45.0
20000    2011-08-09 10:40:00    29.5    40.0
30656    2011-09-15 10:40:00    13.8    100.0

Что я сделал до сих пор:

# Separate the date and times.
df['DATE'] = df['YYYYMMDDHHmm'].dt.normalize()
df['TIME'] = df['YYYYMMDDHHmm'].dt.time
df = df[['DATE', 'TIME', 'TAIR']]
df['RANK'] = 0
for index, row in df.iterrows():
    df.loc[index, 'RANK'] = ranked[ranked['DATE']==row['DATE']]['RANK'].values

Но я думаю, что я иду в очень неправильном направлении, потому что на это уходит много времени.

Как мне улучшить этот код?

1 Ответ

0 голосов
/ 10 сентября 2018

IIUC, вы можете играть с индексами, чтобы соответствовать значениям

df = df.set_index(df.TIMESTAMP.dt.date)\
       .assign(RANK=ranked.set_index('DATE').RANK)\
       .set_index(df.index)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...