Панды выбирают значения каждого часа для каждого идентификатора

У меня есть кадр данных, в котором у меня есть несколько идентификаторов, и для каждого идентификатора у меня есть некоторые значения и временные метки (примерно одно значение каждые 5 минут в течение 5-7 дней подряд). Я хотел бы выбрать для каждого часа и для каждого идентификатора среднее значение, медиану и дисперсию значений в этот час и сохранить их в разных столбцах, как в следующем результате:

hour   mean    var   median     ID
0       2       4      4        1234 
1       4       5      3        1234
...
23      2       2      3        1234

Мои столбцы:

ID                       int64
Value                  float64
Date            datetime64[ns]
dtype: object

Мои временные метки имеют следующий тип:

%Y-%m-%d %H:%M:%S.%f

Как создать окончательный фрейм данных для каждого идентификатора? Большое спасибо

Редактировать:

В следующей строке я правильно создал столбец с часами:

df['hour'] = df.Date.dt.hour

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

df = df.set_index('Date').resample('60T').mean().reset_index()

автоматически он стирает столбцы значений и перезаписывает их средними значениями. Я хотел бы сохранить эти столбцы, чтобы я мог создавать разные столбцы для среднего значения, дисперсии и медианы на основе значений в столбцах «Значение». Как я могу сделать эту часть?


person erken    schedule 07.09.2019    source источник
comment
Я полагаю, вы ищете изменение образца   -  person Terry    schedule 07.09.2019
comment
да, но с повторной выборкой я получаю гигантский пробел между временными метками разных идентификаторов. Если я буду использовать .dropna(), будет то же самое?   -  person erken    schedule 07.09.2019
comment
может ли среднее значение для каждого часа пересекать дни? или это среднее значение за этот час в этот день в этом удостоверении личности?   -  person Terry    schedule 07.09.2019
comment
это среднее значение для этого часа в этот день в этом идентификаторе   -  person erken    schedule 07.09.2019


Ответы (1)


Попробуй это:

# Extract the hour from the Date column
h = df['Date'].dt.hour.rename('Hour')

# Group by ID and Hour
df.groupby(['ID', h]).agg({
    'Value': ['mean', 'var', 'median']
})

Вы можете заменить серию h на pd.Grouper. По умолчанию pd.Grouper группирует индекс. Вы можете установить параметр key так, чтобы он предназначался для другого столбца:

df.groupby([pd.Grouper('1H', key='Date'), 'ID').agg({
    'Value': ['mean', 'var', 'median']
})
person Code Different    schedule 07.09.2019
comment
Я успешно создал час и час столбцов. Но теперь у меня есть список строк с одним и тем же часом. Как я могу создать одну ячейку определенного часа, содержащую среднее значение, медиану и переменную всех значений за этот час? - person erken; 07.09.2019
comment
Затем удалите идентификатор из группового вызова - person Code Different; 07.09.2019
comment
при этом я получаю сообщение об ошибке TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Int64Index' со следующим кодом: df = df.groupby([pd.Grouper(freq = "1H"), "ID"]) \ .agg({"Mean": np.mean}) - person erken; 07.09.2019
comment
Я получаю: TypeError: __init__() got multiple values for argument 'key' Кроме того, я пытался создать разные кадры данных, а затем объединить их все, но когда я выполняю следующий код: 'df1 = pd.DataFrame() \ df1 = df.set_index('Date').resample( '60T').mean().reset_index()' для сохранения результата во вновь созданном df1, df такой же и даже не выполняет среднее - person erken; 07.09.2019
comment
вот результат, который я получаю после вашего кода: все в порядке, но нужно переиндексировать материал, но я не могу: imgur.com /a/nfImzUm - person erken; 08.09.2019