Run The Bridge

(Pandas) 각 Column들의 횟수가 다양하게 존재할 때 횟수별로 Count 후 값 넣기 본문

Python/※Pandas Tip

(Pandas) 각 Column들의 횟수가 다양하게 존재할 때 횟수별로 Count 후 값 넣기

anfrhrl5555 2020. 11. 22. 20:20
728x90
반응형

Project를 진행하면서 tcp, udp, icmp, etc의 횟수를 Count해서 각 공격명에 맞춰서 값을 넣어야하는 상황이 있었다.


공격명은 얼추 24개정도이고, Protocol별 횟수는 모두 상이했다.


로그의 개수는 대략 60000개 정도이다.


1

2

3

count_protocol = []

for i in attack_number:

    count_protocol.append((df_train[df_train['Attack_Name'].str.contains(i)]['Protocol'].value_counts().index[0], df_train[df_train['Attack_Name'].str.contains(i)]['Protocol'].value_counts()[0]))

cs


먼저 빈 list를 하나 생성하고, attack_numberfor문으로 돌렸다.


Attack_number가 무엇인지는 저번 게시글을 보면 나와있다. (nnnn)형식으로 이루어져있다. 먼저 공격명에 따른 Protocolindex를 뽑았다.




코드를 보면 (2242)로 시작하는 udp41518개가 존재한다. 여기서 index라는 함수를 써서 udp를 뽑아온다.



1

df_train[df_train['Attack_Name'].str.contains('2242')]['Protocol'].value_counts().index[0]

cs


그리고 index[0]를 빼고 기본코드에 [0]을 추가해서 횟수를 가져온다.


1

df_train[df_train['Attack_Name'].str.contains('2242')]['Protocol'].value_counts()[0]

cs



이러한 방식으로 for문을 돌린 후 count_protocolprint해보면 다음과 같은 값들이 들어있다.


이 값들을 공격명에 맞춰서 넣어주면 된다.


1

2

for i,k in enumerate(count_protocol):

    train_dataset.loc[i, k[0]] = k[1]

cs


for문에 enumerate를 써서 i값은 차례로 증가하면 train_dataset.lo[1, ‘udp’] = 41518이 된다.


두번째는 train_dataset.lo[2, ‘tcp’] = 5408이 들어가게된다.


다행히 값들이 두 개 이상 존재하는 것이 없어서 가능했다.



이렇게 tcp, udp, icmp, etc에 횟수가 잘 들어갔다.



감사합니다. Thank yuo!

728x90
반응형
Comments