iterrows 를 이용한 조건에 해당하는 행 추출

chaechae·2024년 2월 1일
1
post-thumbnail

🖥️ 문제상황

해당 소환사의 시야점수 지표를 보던중.. 유일하게 낮아지고 있는 지표임을 발견했습니다.🤔

리그 오브 레전드에서 시야점수가 부족해서 일어날 수 있는 상황이 있는데요! 대표적으로 적이 어디있는지 파악이 되지 않아 갱에 당하는 경우라고 할 수 있습니다.

그렇다면 해당 소환사가 실제로 "라인전 동안 죽은경우 중"에서 와드를 박지 않아서 적팀의 GANG을 받은 경우가 있는지 집계해보려고 합니다.🤔

dataframe

  • 아래의 데이터는 matchId 별로 (15분 이전) 해당 소환사의 WARD 설치, CHAMPION_KILL 을 당한 로그 입니다.
  • 갱의 기준은 정글이나 다른 라인에 의해서 죽은 경우를 기준으로 가져왔습니다!

🖥️ CODE

와드를 박았다 하더라도 지속시간이 있기 때문에 사라지는데요. 현재 리그 오브 레전드에서 와딩의 지속시간은 초반 150초로 알고 있습니다🤔 (지금 보니 WAKRD_KILL 타입의 로그도 있는데 이부분을 간과했네요 😭, 일단 'WARD_PLACED', ' CHAMPION_KILL' 기준으로 보겠습니다.)

아무튼 무엇을 해야할것인가!
경기별로 CHAMPION_KILL 을 당하기 전에 WARDING 여부, WARD가 살아 있는지 보려고 합니다. 코드를 하나씩 뜯어 보겠습니다.


results = []
# 각 matchId에 대해 처리
df['timestamp'] = df['timestamp']*60 # timestamp 를 초단위로 변경
for match_id, group in df.groupby('matchId'): 

    # "CHAMPION_KILL"을 당한 행 찾기
    champion_kill_rows = group[group['type'] == 'CHAMPION_KILL']

    for _, row in champion_kill_rows.iterrows():
        # 현재 행의 150초 전 timestamp 계산
        timestamp_before_champion_kill = row['timestamp'] - 150

        # 150초 전부터 현재까지의 행 중 "WARD_PLACED" 찾기
        relevant_rows = group[(group['timestamp'] >= timestamp_before_champion_kill) & (group['timestamp'] <= row['timestamp'])]
        
        # "WARD_PLACED" 여부 확인
        ward_placed_before_death = any(relevant_rows['type'] == 'WARD_PLACED')

        # 결과를 리스트에 추가
        results.append({
            'matchId': match_id,
            'champion_kill_timestamp': row['timestamp'],
            'ward_placed_before_death': ward_placed_before_death
        })

# 결과를 DataFrame으로 변환
result_df = pd.DataFrame(results)

matchid 별로 로그가 남아있기 때문에, 경기별로 그룹 지어준뒤 각 경기별로 CHAMPION_KILL을 당한 행을 찾아줍니다.

result = []

for matchid,group in df.groupby(['matchId']):
    champion_kill_rows = group[group['type'] == 'CHAMPION_KILL']

champion_kill_rowschampion_kill 에 대한 행입니다. 제가 구해야할 것은 이 champion_kill 을 당하기 150초 전에 WARD_PLACED 로그가 있는지 보는것입니다.

    for _, row in champion_kill_rows.iterrows():
        # 1.현재 행의 150초 전 timestamp 계산
        timestamp_before_champion_kill = row['timestamp'] - 150

        # 2.150초 전부터 현재까지의 행 중 "WARD_PLACED" 찾기
        relevant_rows = group[(group['timestamp'] >= timestamp_before_champion_kill) & (group['timestamp'] <= row['timestamp'])]

        # 3. "WARD_PLACED" 여부 확인
        ward_placed_before_death = any(relevant_rows['type'] == 'WARD_PLACED')
        
        # 4.결과를 리스트에 추가
        results.append({
            'matchId': match_id,
            'champion_kill_timestamp': row['timestamp'],
            'ward_placed_before_death': ward_placed_before_death
        })
  1. timestamp_before_champion_kill: champion_kill_rows 는 여러개 있기 때문에 각 행을 순회하면서 champion_kills에 해당하는 timestamp 값에서 150초를 빼줍니다. 해당 값은 은 챔피언이 죽기전 150초 전의 시간이 됩니다.
  2. relevant_rows : 이제 각 group(matchId)별로 챔피언이 죽기전 150초 전의 시간~죽은시간 의 데이터 중에서
  3. ward_placed_before_death : WARD_PLACED 에 해당하는 행이 하나라도 있다면 가져옵니다.
  4. 해당 결과를 추가해주면 끝

결과

ward_placed_before_death 의 값은 True, False로 나타납니다. 갱을 당하기전에 와드가 사라지거나, 와드를 설치 하지 않은 경우는 총 6번이 있었습니다🫠!

📊시각화

전체데스, GANG에의한 데스, 그리고 와드와 관련한 데스를 시각화 해보았습니다 ㅎㅎ

시각화해서 보니 여기서 또 궁금한게 생겼습니다. 그렇게 많은 데이터는 아니지만 주로 8~13분 사이 특히 8분 부터 갱을 많이 당하는것으로 보이는데요! 이때, 적 JUNGLE은 어디서 무엇을 하고 있는지 분석해서 피드백을 드리면 좋겠다는 생각이 들었습니다 😁 바로 진행해보죠!!

profile
다양한 컨텐츠가 있는 곳을 좋아합니다. 시리즈를 참고하시면 편하게 글을 보실 수 있습니다🫠

6개의 댓글

comment-user-thumbnail
2024년 2월 6일

안녕하세요.. 이리저리 구글링하다 우연히 해당 벨로그를 발견했습니다. 현재 비전공자로 데이터분석업계들어가서 최종적으로 넥슨에서 근무를 희망하는데 올리시는 글을 보고 자극받고 갑니다. 혹시 실례가 안된다면 종종 질문드리는 글 같은 것을 올려도 될까요?

1개의 답글