Resample Python pandas исключить некоторые поля - PullRequest
0 голосов
/ 26 января 2020

Эй, ребята, у меня есть такой набор данных:

                      index                           uid     level   sec
Time
2019-12-16 01:38:30    257  Z8RsBpxhnkebK5fvahVCmfV7icO2      wake    30
2019-12-16 01:39:00    258  Z8RsBpxhnkebK5fvahVCmfV7icO2     light  5520
2019-12-16 03:11:00    259  Z8RsBpxhnkebK5fvahVCmfV7icO2       rem   480
2019-12-16 03:19:00    260  Z8RsBpxhnkebK5fvahVCmfV7icO2     light   660
2019-12-16 03:19:00    260  HFxeriowjryghdsjuihdjsuiuiw3    light   660

Я хочу применить повторную выборку для этого набора данных на 15 минут. Я применил

data =dataM.reset_index().set_index('time').resample('15min').mean()

, и у меня есть такой вывод:

                    index     sec
time                                   
2019-12-16 01:30:00  257.500000  2775.0
2019-12-16 01:45:00         NaN     NaN
2019-12-16 02:00:00         NaN     NaN
2019-12-16 02:15:00         NaN     NaN
2019-12-16 02:30:00         NaN     NaN
2019-12-16 02:45:00         NaN     NaN
2019-12-16 03:00:00  259.000000   480.0
2019-12-16 03:30:00  260.000000   1300.0

Моя проблема в том, что я хочу сохранить некоторые поля, которые я не хочу пересчитывать: Мой вывод должен быть:

                      index                           uid        sec
Time
2019-12-16 01:30:00    257  Z8RsBpxhnkebK5fvahVCmfV7icO2        2775
2019-12-16 03:00:00    259  Z8RsBpxhnkebK5fvahVCmfV7icO2        480
2019-12-16 03:15:00    260  Z8RsBpxhnkebK5fvahVCmfV7icO2        660
2019-12-16 03:15:00    260  HFxeriowjryghdsjuihdjsuiuiw3        660

Поскольку некоторые поля должны совпадать с исходным набором данных (поскольку идентификатор не изменяется и индекс тоже)

В этом типе понижения полезно использовать среднее или сумма? Эти данные - время сна людей (учитывая идентификатор). Я попробовал оба оператора, и я думаю, что сумма должна быть лучше в этом случае, потому что со значением я теряю некоторую информацию (я думаю), а не с суммой, я просто сохраняю данные, сначала или раньше.

В этом примере сумма (время сна) в 1:38 равна 5550 в 1:30. Среднее значение - это всего лишь 1.30 ночи, а сон - только 2775 секунды. График будет другим.

РЕДАКТИРОВАТЬ: с другим идентификатором с одним и тем же временем, я не хочу, чтобы вычислили среднее значение секунды, но вычислили два разных значения для разных идентификаторов.

Я пытался использовать функцию groupby при повторной выборке, но у меня было странное поведение:

data =dataM.groupby('uid').resample('15min').mean().dropna()

, таким образом, исходные данные:

2019-12-17 02:04:30    273  Z8RsBpxhnkebK5fvahVCmfV7icO2      wake    30
2019-12-17 02:05:00    274  Z8RsBpxhnkebK5fvahVCmfV7icO2     light  5010
2019-12-17 03:28:30    275  Z8RsBpxhnkebK5fvahVCmfV7icO2      deep   270
2019-12-17 03:33:00    276  Z8RsBpxhnkebK5fvahVCmfV7icO2     light    30
2019-12-17 03:33:30    277  Z8RsBpxhnkebK5fvahVCmfV7icO2      deep   360
2019-12-17 03:39:30    278  Z8RsBpxhnkebK5fvahVCmfV7icO2     light    30
2019-12-17 03:40:00    279  Z8RsBpxhnkebK5fvahVCmfV7icO2      wake   450
2019-12-17 03:47:30    280  Z8RsBpxhnkebK5fvahVCmfV7icO2     light  5700

правильно сгруппированы, но среднее значение очень странное, на самом деле вывод:

2019-12-17 02:00:00  273.5  2520.0
2019-12-17 03:15:00  275.0   270.0
2019-12-17 03:30:00  277.5   217.5
2019-12-17 03:45:00  280.0  5700.0

верно для 02:00:00, но я действительно не понимаю, зачем создавать новое значение 03:15:00

потому что для меня это данные:

  2019-12-17 03:28:30    275  Z8RsBpxhnkebK5fvahVCmfV7icO2      deep   270
    2019-12-17 03:33:00    276  Z8RsBpxhnkebK5fvahVCmfV7icO2     light    30
    2019-12-17 03:33:30    277  Z8RsBpxhnkebK5fvahVCmfV7icO2      deep   360

Должно быть:

2019-12-17 03:30:00  277.5   220

Поскольку три значения довольно близки к 3:30, вместо создания нового в 3:15 (потому что слишком много уважения 3:30).

Спасибо,

1 Ответ

2 голосов
/ 26 января 2020

IIU C, я думаю, это будет работать

data =df.set_index('Time').resample('15min').agg({'sec':'mean','index':'mean', 'uid':'first' }).dropna()
...