У меня есть следующий DataFrame с двумя столбцами даты и времени:
start end
0 01.01.2018 00:47 01.01.2018 00:54
1 01.01.2018 00:52 01.01.2018 01:03
2 01.01.2018 00:55 01.01.2018 00:59
3 01.01.2018 00:57 01.01.2018 01:16
4 01.01.2018 01:00 01.01.2018 01:12
5 01.01.2018 01:07 01.01.2018 01:24
6 01.01.2018 01:33 01.01.2018 01:38
7 01.01.2018 01:34 01.01.2018 01:47
8 01.01.2018 01:37 01.01.2018 01:41
9 01.01.2018 01:38 01.01.2018 01:41
10 01.01.2018 01:39 01.01.2018 01:55
Я бы хотел посчитать, сколько пусков (интервалов) одновременно активны, прежде чем они заканчиваются в данный момент. время (другими словами: сколько раз каждая строка перекрывается с остальными строками ).
Например, с 00:47 до 00:52 только один активен, с 00:52 до 00:54 два, с 00:54 до 00:55 только один снова и т. Д.
Я попытался сложить столбцы друг на друга, отсортировать по дате и, перемещаясь по всему фрейму данных, дать каждому «началу» +1 к счетчику и -1 к каждому «концу». Это работает, но в моем исходном фрейме данных, где у меня несколько миллионов строк, итерация занимает вечность - мне нужно найти более быстрый путь.
Мой оригинальный basi c -и-не-очень хорошо код:
import pandas as pd
import numpy as np
df = pd.read_csv('something.csv', sep=';')
df = df.stack().to_frame()
df = df.reset_index(level=1)
df.columns = ['status', 'time']
df = df.sort_values('time')
df['counter'] = np.nan
df = df.reset_index().drop('index', axis=1)
print(df.head(10))
дает:
status time counter
0 start 01.01.2018 00:47 NaN
1 start 01.01.2018 00:52 NaN
2 stop 01.01.2018 00:54 NaN
3 start 01.01.2018 00:55 NaN
4 start 01.01.2018 00:57 NaN
5 stop 01.01.2018 00:59 NaN
6 start 01.01.2018 01:00 NaN
7 stop 01.01.2018 01:03 NaN
8 start 01.01.2018 01:07 NaN
9 stop 01.01.2018 01:12 NaN
и:
counter = 0
for index, row in df.iterrows():
if row['status'] == 'start':
counter += 1
else:
counter -= 1
df.loc[index, 'counter'] = counter
конечный вывод:
status time counter
0 start 01.01.2018 00:47 1.0
1 start 01.01.2018 00:52 2.0
2 stop 01.01.2018 00:54 1.0
3 start 01.01.2018 00:55 2.0
4 start 01.01.2018 00:57 3.0
5 stop 01.01.2018 00:59 2.0
6 start 01.01.2018 01:00 3.0
7 stop 01.01.2018 01:03 2.0
8 start 01.01.2018 01:07 3.0
9 stop 01.01.2018 01:12 2.0
Есть ли способ, которым я могу сделать это с помощью НЕ с помощью iterrows ()?
Заранее спасибо!