마케터의 파이썬 (3)
판다스를 사용하기 위한 기본 코딩
import pandas as pd
from pandas import DateFrame 1
from pandas import Series
2행과 3행은 각각 판다스의 데이터와 시리즈 자료 구조를 파이썬으로 불러온다.
데이터 프레임은 여러 개의 행과 열로 이루어진 데이터이며, 시리즈는 하나의 열을 의미한다.
판다스로 파이썬에 엑셀 데이터 가져오기
맥 : 디렉토리를 슬래시로 구분한다.
ex) '/Users/junghs/4장_예제.xlsx'
윈도우 : 디렉토리를 역슬래시로 구분한다.
ex) 'C:₩Users₩4장_예제.xlsx'
인코딩
인코딩 타입을 지정해주지 않으면 한글 파일이 깨질 수 있다.
인코딩은 문자 인코딩을 말하며 문자나 기호의 집합을 컴퓨터에 표현하는 방식이다.
특히 나라마다 언어가 다르고 같은 언어라도 다양한 인코딩 방식이 존재한다.
한글은 'utf-8', 'utf-16', 'euc-kr', 'cp949' 인코딩이 주로 사용된다.
텍스트 문서가 인코딩된 방식에 맞추어 인코딩을 지정해주어야 하며 그렇지 않으면 오류가 출력되거나 한글이 깨지는 현상이 발생한다.
매개변수
데이터 가공에 더 유리한 형태로 가져올 수 있게 된다.
- name 매개변수 사용하기
pd.read_excel('파일이름', names = ['ID', 'name', 'age', 'job', 'sex', 'conv'])
name 매개변수로 컬럼명을 변경할 수 있다.
- index_col 매개변수 사용하기
pd.read_excel('파일이름', index_col = 'Customer_ID')
이 매개변수는 칼럼명 중 하나를 선택해 해당 칼럼을 인덱스로 변환할 수 있다. 위 코드는 Customer_ID를 인덱스로 설정했다.
- sheet_name 매개변수 사용하기
pd.read_excel('파일이름', sheet_name = 'Sheet2')
시트2 데이터가 불려왔음을 확인할 수 있다.
- skiprows 매개변수로 필요없는 행 제거하기
pd.read_excel('파일이름', sheet_name = 'Sheet3', skiprows=1)
매개변수에 숫자를 입력하면 ㅓㅅ 번째 행부터 해당 숫자 미만의 행을 제외한다. 혹은 리스트 형태로도 필요없는 행을 제외할 수 있다.
- skiprows 함수로 3행 미만의 행 제외하기
# 3행 미만의 행을 제외한다
pd.read_excel('파일이름', sheeet_name = 'Sheet3', skiprows = 3)
# 리스트로 3행 미만의 행을 제외한다
pd.read_excel('파일이름', sheet_name = 'Sheet3', skiprows = [0, 1, 2])
인덱스 지정하기
# 리스트 사용
df = DataFrame(dict_data, index = [1,2,3,4,5]
# range 함수 전달
df = DataFrame(dict_data, index = range(1, 6))
인덱스가 1부터 5까지 생기게 된다.
- 칼럼 순서 지정하기
df = DataFrame(dict_data,
index = [1,2,3,4,5],
columns = ["job", "residence", "age"])
전달된 순서 job, residence, age로 데이터 프레임의 칼럼이 출력된다.
인덱스 다루기
인덱스는 고유한 식별을 위해 사용된다. 고유한 식별이므로 별도의 조치가 없이 수정되면 안된다. 주민등록번호를 임의로 바꿀 수 없는 것과 같은 이치다. 인덱스를 수정하려면 인덱스를 해제한 후 가능하다.
- 칼럼 중 하나를 인덱스로 설정하기
df_age = df.set_index("age")
set_index 함수는 자동으로 생성된 숫자 인덱스 대신 존재하는 칼럼 중 하나를 전달하여 인덱스로 설정한다.
- 기존 인덱스로 반환하기
df_reset = df_age.reset_index()
reset_index 함수는 기존 인덱스를 컬럼으로 반환한다. 새로운 숫자 인덱스를 생성한다.
- 기존 인덱스 삭제하기
df_reset_drop = df_age.reset_index(drop = True)
reset_index(drop = True) 함수는 매개변수 drop = True 를 사용하여 기존 인덱스를 칼럼에 반환하지 않고 삭제한다.
iloc 인덱서
iloc 인덱서는 숫자를 사용해서 위치를 지정하는 인덱서이다.
df = pd.read_csv('4장_예제.csv')
df2 = pd.read_excel('4장_예제.xlsx')
df3 = pd.read_excel('4장_예제2.xlsx')
ads = pd.read_excel('4장_예제_ads.xlsx')
concat = pd.read_excel('4장_예제_concat.xlsx')
merge = pd.read_excel('4장_예제_merge.xlsx')
str = pd.read_excel('4장_예제_str.xlsx')
데이터프레임변수.iloc[행 번호, 열 번호]
콤마가 생략된 iloc[1]은 1이 행 인덱스라는 것을 알아두기
df2.iloc[0,0]
-> 10000
- 리스트 전달하기
df2.iloc[[0,2], [0,2]]
0,2 행과 0, 2열의 리스트를 전다하여 자료를 반환한 결과가 출력된다.
- 슬라이싱하기
행 인덱스와 열 인덱스에 슬라이싱을 사용하여 해당 범위의 자료를 반환할 수 있다. 이떼 콜론만 사용하면 행 전체 혹은 열 전체를 나타낸다.
df2.iloc[:2, 0:2]
2행 및 2열 미만을 슬라이싱하여 자료가 반환된다.
- 행 인덱싱하기
iloc 인덱스에 전달인자가 한 개의 숫자가 있는 경우(콤마 없이 숫자만) 해당 숫자의 행 데이터 전체를 반환한다.
df.iloc[[2, 4]]
2행과 4행에 해당하는 결과가 출력된다.
- 열 인덱싱하기
df2.iloc[:,0]
열 인덱스에 원하는 열을 전달하였다. 코드를 입력하면 0열 전체를 출력한다.
loc 인덱서
loc 인덱서는 행 인덱스(행 이름) 혹은 열 인덱스(칼럼명)을 입력하여 데이터를 반환하는 방법이다.
iloc 인덱서는 해당 칼럼이 있는 정수 위치를 파악해야 하지만 자주 사용하는 칼럼이라면 loc 인덱서에 인덱스명을 입력하여 데이터를 선택하면 된다. 형태가 같은 데이터라도 칼럼 위치가 변동될 수 있어 iloc 인덱서보다 loc 인덱서가 데이터를 명확하게 반환할 수 있다.
- 행 인덱스가 숫자로 자동 생성된 경우
df2.loc[0, 'Customer_ID']
전체 행 인덱스 중 loc 인덱서에 입력된 숫자 혹은 문자와 일치하는 행의 데이터가 반환된다.
- 행의 인덱스를 칼럼명으로 지정했을 경우
df3 = df3.set_index("나이")
df3.loc[29, 'Customer_ID']
- loc 인덱서에서 행 및 열 인덱싱하기
df2.loc[3, '직업']
df2.loc[[0,2], ['Customer_ID', '나이']]
- 행과 열 인덱싱하기
df2.loc[:2, 'Customer_ID' : '나이']
loc 인덱서의 경우 iloc 인덱서와 다르게 슬라이싱의 마지막 값도 포함된다. 이는 순번 정수가 아니라 이름 레이블 기반이기 때문이다.
만약 이름을 행 인덱스로 설정했다고 하면, 김영수 이상 차정민 미만이라고 하면 부자연스럽다.
이름은 수가 아니기 때문이다. 김영수에서 차정민까지가 자연스럽다.
iloc, loc 인덱서를 이용해 값을 변환하기
df2.iloc[0,5] = 'X'
iloc 인덱서를 이용해 데이터프레임의 0행 5열의 값을 문자열 'X'로 치환했다.
- loc 인덱서를 사용한 값 변환하기
df2.loc[1, '전환'] = 'X'
loc 인덱서를 활용해서 값을 변환했다. 1번 인덱스의 '전환' 칼럼에 해당하는 값이 변환된다.
- loc 인덱서와 리스트를 활용한 값 변환하기
df2.loc[[2,3],'직업'] = ['마케터', '기획자']
2번 인덱스와 3번 인덱스의 '직업' 칼럼 값이 각각 '마케터', '기획자'로 변환된다.
- iloc 인덱서와 range 함수를 활용한 값 변환하기
df2.loc[2:4, 'Customer_ID'] = range(20002, 20005)
컬럼명으로 데이터프레임 열 선택하기
- 컬럼에 불리언 마스크를 생성하여 데이터프레임에 적용하기
df2[df2['직업'] == '마케터']
- 컬럼에 & 조건을 적용해서 불리언 마스크 생성하기
(df['직업'] == '마케터') & (df['나이'] >= 30)
각 불리언 마스크를 괄호로 묶고 그 후 논리연산자로 연결해서 원하는 결과를 추출
- 논리합을 사용하여 불리언 마스크 생성하기
df[(df['직업'] == '마케터') | (df['직업'] == '디자이너')]
| 는 파이프라 불리며 논리합으로 or 조건을 뜻한다. 즉 둘 중 한 조건만 만족하면 된다.
데이터프레임 제공 함수
- 결측값
파이썬에서 제공하는 데이터프레임 집계 함수는 기본적으로 결측치를 제외하고 계산한다.
결측값 포함 여부는 skipna 매개변수에 True 혹은 False를 할당하여 처리할 수 있다.
- skipna 매개변수가 없을 경우
ads.sum(axis=1)
axis = 1은 열을 따라서 합산한다.
- skipna 매개변수에 False를 할당한 경우
ads.sum(axis=1, skipna=False)
skipna에 False를 할당하면 결측값이 나오게 된다.
skipna는 Nan을 건너뛰라는 것을 뜻한다. NaN를 포함해서 연산하면 계산이 안되기 때문에 연산 결과 역시 NaN이 나올수밖에 없다.
NaN를 포함한다는 것은 결측값이 발생하면 해당 데이터는 고려하지 않겠다는 의미다.
axis의 이해하기
axis 매개변수 여부에 따라 열 기준, 행 기준으로 연산해준다. axis는 축을 의미하고, 함수의 연산 방향을 지정한다.
- 행 방향 연산
ads.sum(axis=0)
axis = 0 혹은 별도로 입력하지 않으면 행 방향에 따라 연산된다.
ads.sum(axis=1)
axis = 1 을 입력하면 열 방향에 따라 연산된다.
- drop 함수 사용하기
ads.drop('구글')
drop 함수는 axis = 0 혹은 변수를 별도를 입력하지 않으면 행 인덱스를 선택하고 삭제한다.
- 데이터가 NaN인 7월 7일 데이터를 삭제하려면?
ads.drop('7월 7일', axis=1)
- median 함수 사용하기
ads.median()
ads.median(axis=1)
- quantile 함수 사용하기
ads.quantile()
ads.quantile(axis=1)
quantile 함수는 기본적으로 중앙값(2사분위 수)을 출력하며, 0이상 1이하의 값을 전달하면 해당하는 위치의 분위수를 출력한다.
- idxmin, idmax 함수 사용하기
ads.idxmin
ads.idxmin(axis=1)
idxmin 함수는 최솟값의 색인을, idmax는 최댓값의 색인을 출력한다.
- pct_change 함수 사용하기
ads.pct_change()
ads.cumsum()
cumsum 함수는 누적 합을 출력한다.
- diff 함수 사용하기
ads.diff()
diff() 함수는 차이값을 출력한다.
데이터프레임 기본 함수
함수는 () 괄호를 붙이지만 속성은 괄호가 없다.
속성 : index, shape, column
- rename 함수로 행 인덱스 변경하기
df.rename({0 : '첫번째', 1 : '두번째'})
- rename 함수로 열 인덱스 변경하기 (axis = 1)
df.rename({'Customer_ID' : '고객번호', '나이' : '연령'}, axis = 1)
- sort_values 함수로 오름차순 정렬하기
df.sort_values("나이")
sort_values 함수는 전달된 인덱스를 기준으로 전체 데이터프레임을 정렬한다.
- sort_values 함수로 내림차순 정렬하기
df.sort_values("나이", ascending = False)
- drop 함수 사용하기
df.drop('이름', axis=1)
drop 함수는 axis 매개변수에 따라 행 또는 열을 선택할 수 있다. drop 함수에는 원본 데이터의 변경 여부를 결정하는 inplace 매개변수가 있다. 디폴트는 원본 데이터 유지인 inplace = False 로 설정되어 있다.
- drop 함수로 삭제된 원본 데이터 반영하기
df.drop('이름', axis = 1, inplce = True)
df를 다시 실행해보면 원본 데이터가 그대로인 것을 알 수 있다. 만약 삭제된 내용을 원본 데이터에 반영하고 싶다면 inplace 매개변수에 True 값을 할당하면 된다.
concat과 merge로 데이터 합치기
- concat 함수
pd.concat([df, add])
concat 함수에 데이터프레임 변수를 리스트로 전달하면 변수의 동일한 칼럼을 기준으로 행 방향으로 합친다.
만약 합친 데이터프레임을 다루고 싶다면 합칠 때 저장할 데이터프레임을 지정하거나 새로운 데이터프레임을 만들어야 한다.
- 공통 컬럼 순서가 다른 두 데이터 합치기
idx = df.set_index('Customer_ID')
inform2_idx = inform2.set_index('Customer_ID')
pd.concat([idx, inform2_idx], axis=1)
공통 칼럼을 인덱스로 설정한 뒤 concat 함수를 사용하는 방법