본문 바로가기
IT, Software/Python

Python 데이터 분석 콘텐츠 추천 - Pandas 데이터 만들기

by 기타마을이장 2020. 10. 7.

첫단계에서 json을 파싱해서 내가 필요한 데이터를 찾아서 쌓을 수있는 준비가 되었으니

두번째 단계로 Pandas로 기초 Dataset을 만들어본다.

 

1. 서버내 여러 사용자들이 페이지를 방문한 기록들을 json형태로 저장해둔 로그파일에서 파싱한 뒤

 

2. 각 사용자들별로 몇 번의 방문이 있었는지, 머문 시간은 얼마나 되는지를 Pandas로 데이터화한 뒤

1차 가공된 데이터를 기반으로 유사성향의 사용자들을 분류하기 위한 클러스터링을 수행하고자 한다.

 

3. 그리고 특정 사용자가 접속했을때, 해당 사용자가 속해 있는 고객군 내에서 다른 사용자들이 이용한 콘텐츠를

추천해주려는 것이 최족 목표이다.


 

 

## Pandas를 이용해 Dataset으로 만들기

 

json 파일에서 가져온 값들을 Pandas를 이용해 Dataset으로 만들기 시작했다..

 

Pandas는 쉽게 얘기하면 테이블이라고 봐도 무방할것 같다.(엑셀과 같은)

또한, 데이터분석에 사용되는 여러 라이브러리들(Scypy 등)이나 시각화 툴(Plotly 등)들이

Pandas 데이터를 활용할 수 있도록 구성되어 있어 Pandas로 데이터를 만드는것이 데이터분석의 시작이라고 생각된다.

 

import pandas as pd

df = pd.DataFrame(columns = ['user', 'page', 'cnt', 'usetime'])
df = df.set_index(['user', 'page'])

생성한 DaraFrame의 형태는 Multi Index를 걸었다.

 

이유는 사용자별로 여러 곳의 페이지를 이용할 수 있기에...user와 page를 멀티인덱스로 걸었고,

로그를 한줄한줄 읽어서 사용자번호와 페이지번호를 읽어서 cnt와 usertime 을 차곡차곡 누적시켜 나갔다.

 

만들어진 Dataset은 중간중간 유실을 막고자 저장을 해두는게 좋다.

그래서 아래와 같이 중간중간 파일로 저장하는 로직을 넣어뒀다.

 

특히 피클이 좀 더 유용했는데, 이유는 내가 설정해둔 Index 구조까지 모두 그대로 파일로 저장하고

읽어오면 그대로 불러와져서 매우 유용했다.

import pandas as pd

df = pd.read_csv('C:\Temp\Test.csv')  # csv 읽기
df.to_csv('C:\Temp\Output.csv')  # csv 쓰기

df = pd.read_pickle('C:\Temp\Test.pkl')  # Pickle 읽기
df.to_pickle('C:\Temp\Output.pkl')  # Pickle 쓰기

 

## Pandas 인덱스로 값 업데이트 하기

 

로그에서 값을 처리하면서 차곡차곡 데이터를 쌓아가려면 DataFrame에서 검색해서 값을 업데이트 해야 한다.

난 Multi Index를 걸어놨으니 그냥 Pandas Index 검색을 통해서 해서 값을 업데이트 했다.

 

ex) 'yoon' 이라는 user가 1번 페이지를 방문횟수 1증가와 이용시간 1분 증가시켜 업데이트

user = 'yoon'
page = 1
cnt, time = df.loc[(user, page), ('cnt', 'useTime')]
df.loc[(user, page), ('cnt', 'useTime')] = (cnt + 1, time + 60)

 

## Pandas 인덱스 없이 특정 값 업데이트 하기

 

만약 Index가 안걸려있다면 SQL 로 따지면 where 조건을 걸어서 update 하는 방법으로 진행해야 한다.

 

Pandas로 해당 동작을 수행하기 위해 구글링으로 여러 example들을 확인해 본 결과...

아래와 같은 방식들을 응용해서 조건에 맞는 기존 데이터를 업데이트해 줬다.

# 특정컬럼에서 특정한 값을 찾고 싶은 경우
df.loc[df['column_name'] == some_value]

# 특정 list안에 존재하는 값들만 찾고 싶은 경우
df.loc[df['column_name'].isin(some_values)]

# 여러자기 조건을 걸고 싶은 경우 - 각 조건을 ( ) 로 감싸고, ' & ' 나 ' | ' 을 쓸수 있다. 
df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]

Stackoverflow에서 찾은 방법도 나름 직관적이었기 때문에 기록해 둔다.

아래와 같이 하면 기존 Harry를 Matt로 바꿀 수 있음

df = df.loc[(df['A']=='Harry') & (df['B']=='George') & (df['C']>'2019'),'A'] = 'Matt'

 

 

change column value based on multiple conditions

I've seen a lot of posts similar but none seem to answer this question: I have a data frame with multiple columns. Lets say A, B and C I want to change column A's value based on conditions on A, ...

stackoverflow.com

역시 내가 격는 모든 문제들은 Stackoverflow 에서 그리고 여러 방면에서 많은 이들이 고민하고 있었던 것 같다.

반응형

댓글