2017-12-21 24 views
0

그래서 데이터 프레임이 있는데 다음을 확인하려고합니다 :데이터 프레임에서 한 기간 내에 조건을 확인합니다. [파이썬] [팬더]

가해자와 피해자가 특정 시간 (타임 스탬프)에 관계가있는 경우, 피해자는 일정 기간 내에 가해자가되며 그 반대도 마찬가지입니다.

예. 시간 프레임 (Z + 24hrs) 여기서

 X  Perpetrator   Victim   Time Stamp 
44  3    FvdP   Jmallios 2002-11-13 21:53:17 
45  2    FvdP    FvdP 2002-11-13 21:58:59 
46  28    Lir    Lir 2002-11-19 00:47:05 
47  16 194.117.133.118   Tinulim 2002-11-27 00:13:40 
48  15   Tinulim 194.117.133.118 2002-11-27 00:16:03 
49  14    Zocky   Tinulim 2002-11-27 00:23:28 
50  13 194.117.133.118    Zocky 2002-11-27 00:25:31 

내의 Y 공격 X 데이터 프레임의 부분 인 경우 if X attacks Y at time Z는 카운트를 추가한다. 예를 들어, 사용자 194.117.133.118이 사용자 Tinulim을 공격 한 후 3 분 후 194.117.133.118을 공격합니다. [타임 스탬프 항목은 datetime.Timestamp 형식의 개체입니다.

새 데이터 프레임에 사용자와 개수를 모두 추가하고 싶습니다. 예 :

  Initiator   Retort   Time Stamp 
1 194.117.133.118   Tinulim 2002-11-27 00:13:40 

나는 현재 iterrows과 루프를 사용하고 있지만, 제대로이 기능을 사용하여 포맷 할 수 없습니다 : 여기

def time_window_24(time1,time2): 
    "Is time2 within 24 hours ahead of time1?" 
    if (time2 - time1).days == 0 and time1!=time2: 
     return True 
    else: 
     return False 
+0

Welco 나를 'StackOverflow'에 연결하려면 [MVCE] (https://stackoverflow.com/help/mcve)를 제공하십시오. – Hille

+0

주어진 샘플 입력에 대해 예상 출력을 제공하십시오. – jo9k

+0

@ jo9k 예제 데이터 프레임의 예상 출력은 미안합니다. –

답변

0

당신이 API를 여기에서 볼 수있는 pd.merge_asof를 사용하여 작동하는 것 같다 솔루션입니다 : merge_asof docs

data = """ 
perpetrator,victim,date 
FvdP,Jmallios,2002-11-13 21:53:17 
FvdP,FvdP,2002-11-13 21:58:59 
Lir,Lir,2002-11-19 00:47:05 
194.117.133.118,Tinulim,2002-11-27 00:13:40 
Tinulim,194.117.133.118,2002-11-27 00:16:03 
Zocky,Tinulim,2002-11-27 00:23:28 
194.117.133.118,Zocky,2002-11-27 00:25:31 
""" 
from io import StringIO 
df = pd.read_csv(StringIO(data), parse_dates=[2]) 
df = df.query('perpetrator != victim') 
merged = pd.merge_asof(df, 
         df, 
         on=['date'], 
         right_by=['perpetrator', 'victim'], 
         left_by=['victim', 'perpetrator'], 
         direction='forward', 
         tolerance=pd.tslib.Timedelta('1 day'), 
         suffixes=('', '_res')) 
merged = merged.rename(columns={'victim_res': 'initiator', 
           'perpetrator_res': 'retort'}) 
print(merged[merged.retort.notnull()][['initiator', 'retort', 'date']].to_string()) 

initiator retort date 1 194.117.133.118 Tinulim 2002-11-27 00:13:40

+0

완벽하기 때문에 merge_asof에 대해 들어 본 적이 없으니 참고하시기 바랍니다. 감사! –