У меня есть следующий фрейм данных pandas df
:
отметка времени | версия | действительный | пред |
---|---|---|---|
2022-01-19 11:00:00.600 | 1 | 0 | 0 |
2022-01-19 11:00:00.800 | 1 | 0 | 1 |
2022-01-19 11:00:01.200 | 1 | 1 | 0 |
2022-01-19 11:00:01.800 | 1 | 0 | 0 |
2022-01-19 11:00:02.200 | 2 | 1 | 1 |
2022-01-19 11:00:02.600 | 2 | 0 | 0 |
2022-01-19 11:00:03.200 | 3 | 0 | 1 |
2022-01-19 11:00:03.600 | 3 | 0 | 0 |
2022-01-19 11:00:03.800 | 3 | 1 | 0 |
2022-01-19 11:00:03.600 | 4 | 0 | 0 |
2022-01-19 11:00:03.800 | 4 | 0 | 1 |
Мне нужно рассчитать общее расстояние в миллисекундах между значениями 1
в actual
и pred
, сгруппированными по version
.
Ожидаемый ответ: 1000 мс
Предполагая, что существует одно «фактическое» и одно «предварительное» значения для каждой «версии», мы могли бы просто вычесть значения. Другими словами, если каждая «версия» имеет ровно 1 «фактическое» и ровно 1 «предварительное» значение, то df['actual'].eq(1)
будет иметь значение «Истина» ровно для одного значения на «версию»; то же самое для df['pred'].eq(1)
. Поскольку данные сортируются по «версии», версии совпадают.
df['timestamp'] = pd.to_datetime(df['timestamp'])
out = ((df.loc[df['actual'].eq(1), 'timestamp'].to_numpy() -
df.loc[df['pred'].eq(1), 'timestamp'].to_numpy())
.astype('timedelta64[ms]').sum())
Если не во всех версиях есть 1 в «фактическом» или «предварительном», мы все равно можем отфильтровать значения «фактического» и «предварительного»; затем объедините «версию» (чтобы каждая «версия» имела «фактическое» и «предварительное» значение); затем найдите разницу и sum
:
df['timestamp'] = pd.to_datetime(df['timestamp'])
merged = (df.loc[df['actual'].eq(1), ['version', 'timestamp']]
.merge(df.loc[df['pred'].eq(1), ['version', 'timestamp']],
on='version', suffixes=('_actual', '_pred')))
out = (merged['timestamp_actual'] - merged['timestamp_pred']).astype('timedelta64[ms]').sum()
Выход:
1000
Другими словами, различия должны рассчитываться только в пределах одних и тех же значений version
.
В моем реальном наборе данных данные не сортируются по version
, потому что version
это строка. Также иногда для одного и того же version
могут быть все нули actual
или pred
. Мои искренние извинения за это обновление. Я просто не учел его важность.
@Fluxy, но в каждой версии будет не более одной 1, верно?
Да все верно.
@Fluxy Я отредактировал версию, которая должна работать в этом случае.
Спасибо. Не могли бы вы уточнить, как группировка по
version
работает в предложенном вами решении?