filter 와 lambda를 이용한 데이터 전처리

chaechae·2024년 1월 30일
0
post-thumbnail

league of legends 데이터를 전처리하면서 필요했던 코드들을 정리해 보려고합니다.

전처리가 필요한 상황

🔥전처리 목표 " 우리팀이 죽은 로그만 가져오기"

메인 데이터는 여러개의 매치경기가 concat 된 dataframe 형태 였는데요!
우리팀 포지션이 상대의 어떤 포지션에게 죽었는지 알기위해서는 killerId, vicitmId가 어떤 참가자인지에 대한 정보가 필요하단 말이죠!

즉, 각 matchId 별로 각 참가자들의 participantId, championName, teamPosition 을 merge 해줘야하는 전처리가 필요했습니다. 데이터를 보면 아래와 같습니다!

matchId별 kill log는 아래와 같은 형식입니다.

💻kill log

💻champion_info

그리고 그 참가자에 대한 정보는 아래의 match_info 데이터에서 참가자별 정보를 따로 만들어 놓은 champion_info 데이터를 만들어놓은 상태입니다.

  • kill_log는 participantId가 killerId, vicitmId 컬럼명으로 표현되어 있다.
  • matchId 마다 teamId, participantId가 다르기 때문에 조건을 걸어줘야한다!

🔎 code 정리


# 소환사와 같은팀 정보(vicitmId) - 죽은입장
team_info = (
          champion_info.groupby(['matchId', 'teamId']).filter(lambda x: any(x['summonerName'] == summoner_name))
        )[['matchId','teamId','participantId','summonerName','teamPosition','win']] 

        team_info.columns = ['matchId','teamId','victimId','summonerName','victimPosition','win']

# 반대팀 정보(killerId) - 죽인입장
opponent_info = (
        champion_info.groupby(['matchId', 'teamId']).filter(lambda x: not any(x['summonerName'] == summoner_name))
        )[['matchId','teamId','participantId','summonerName','teamPosition','win']]

        opponent_info.columns = ['matchId','teamId','killerId','summonerName','killerPosition','win']

여러 방법이 있겠지만... 저는 해당 소환사가 속한 팀 정보, 그리고 적정보 테이블을 따로 나눠서 merge 했습니다! 간단하게 설명해보겠습니다.

우리팀이 당한(victim) 입장이고 상대가 (killer)인 입장의 데이터만 가져와야 했기 때문에

  • 먼저, 해당 summoner_name(나) 와 같은팀들의 정보만 가져오고 participantId 를 vicitimId로 바꿔 준다음 kill_log를 'matchId','victimId' 별로 merge 하게 되면 자동적으로 우리팀이 데스한 로그만 남게 됩니다!

  • 그리고 반대로 나머지 적팀들의 정보만 가져오고 participantId 를 killerId로 바꾼 다음 merge된 데이터와 다시 결합해주면 완성!

🔎 groupby, filter, lambda

먼저, 어떤 경기는 red(teamId = 100)팀 어떤 경기는 blue(200)팀 이기 때문에, matchId, teamId 별로 groupby 해주어야합니다. 이렇게 함으로써 같은 매치 내에서 같은 팀에 속한 정보들이 함께 묶이고

fileter 와 lambda를 이용해서 "summonerName" 이 == 나(summoner_name) 에 속하는 'GROUP' 을 가져오면 끝! 반대도 마찬가지입니다!

이렇게 matchid 별로 'summonerName' == '메시아빠우왁굳'에 속한 team 데이터를 가져올 수 있습니다!

그 다음 먼저, victimId 를 기준으로 team_info와 결합 하고 killerId를 기준으로 opponent_info 와 결합 해주면 자동적으로 "우리팀이 상대의 어떤 포지션에 죽었는지" 알 수 있는 데이터프레임 완성!

# merge
team_death_log = pd.merge(kill_log, team_info, on =['matchId','victimId'], how = 'inner')
team_death_log = pd.merge(team_death_log,opponent_info, on=['matchId','killerId'], how ='inner' )

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

0개의 댓글