Pandas Group по 2 столбцам, используя другой столбец, чтобы найти дельту - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть 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)

1 Ответ

0 голосов
/ 14 февраля 2019
import datetime as dt

source_changed = df['sourcehostname'] != df['sourcehostname'].shift()
dest_changed = df['destinationaddress'] != df['destinationaddress'].shift()
change_occurred = (source_changed | dest_changed)

time_diff = df['tvalue'].diff()

now = dt.datetime.utcnow()
zero_delta = now - now

df['time_diff'] = time_diff
df['change_occurred'] = change_occurred

# Then do a function
# If df['change_occurred'] is True -> set the value of df['delta'] to zero_delta  
# Else set df['delta'] to the value at df['time_dff']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...