У меня есть pandas dataframe, у которого 4909144 строки, с индексом time
, source_name
, dest_address
и tvalue
, который точно такой же, как индекс time
.Я отсортировал df по source_name
, dest_address
и tvalue
, используя следующее, чтобы они были сгруппированы по порядку по времени:
df = df.sort_values(by=['sourcehostname','destinationaddress','tvalue'])
Что дает мне:
source_name dest_address tvalue
time
2019-02-06 15:00:54.000 source_1 72.21.215.90 2019-02-06 15:00:54.000
2019-02-06 15:01:00.000 source_1 72.21.215.90 2019-02-06 15:01:00.000
2019-02-06 15:30:51.000 source_1 72.21.215.90 2019-02-06 15:30:51.000
2019-02-06 15:30:51.000 source_1 72.21.215.90 2019-02-06 15:30:51.000
2019-02-06 15:00:54.000 source_1 131.107.0.89 2019-02-06 15:00:54.000
2019-02-06 15:01:14.000 source_1 131.107.0.89 2019-02-06 15:01:14.000
2019-02-06 15:03:02.000 source_2 69.63.191.1 2019-02-06 15:03:02.000
2019-02-06 15:08:02.000 source_2 69.63.191.1 2019-02-06 15:08:02.000
Я хочу разницу между временами, поэтому я тогда использую:
#Create delta
df['delta'] = (df['tvalue']-df['tvalue'].shift()).fillna(0)
Что дает мне:
source_name dest_address tvalue delta
time
2019-02-06 15:00:54.000 source_1 72.21.215.90 2019-02-06 15:00:54.000 00:00:00
2019-02-06 15:01:00.000 source_1 72.21.215.90 2019-02-06 15:01:00.000 00:00:06
2019-02-06 15:30:51.000 source_1 72.21.215.90 2019-02-06 15:30:51.000 00:29:51
2019-02-06 15:30:51.000 source_1 72.21.215.90 2019-02-06 15:30:51.000 00:00:00
2019-02-06 15:00:54.000 source_1 131.107.0.89 2019-02-06 15:00:54.000 -1 days +23:30:03
2019-02-06 15:01:14.000 source_1 131.107.0.89 2019-02-06 15:01:14.000 00:00:20
2019-02-06 15:03:02.000 source_2 69.63.191.1 2019-02-06 15:03:02.000 00:01:48
2019-02-06 15:08:02.000 source_2 69.63.191.1 2019-02-06 15:08:02.000 00:05:00
Но я бы хотел сгруппировать по source_name
иdest_address
и получите разницу в tvalue
, чтобы я не столкнулся с delta
как -1 days +23:30:00
или delta
как 00:01:48
после первой записи source_2
, когда она должна быть 00:00:00
.
Я пытаюсь:
df.groupby(['sourcehostname','destinationaddress'])['tvalue'].diff().fillna(0)
Но это занимает очень много времени и может не дать мне результаты, которые я ищу.
Следующее не работает, но вы можете сделать что-то вроде моего исходного кода, но добавить группу?:
#Create delta
df['delta'] = df.groupby(['sourcehostname','destinationaddress'])(df['tvalue']-df['tvalue'].shift()).fillna(0)