티스토리 뷰
# 피벗 (.pivot) * 중요
- 데이터 테이블 재배치(구조 변경)
- 여러 column을 index, values, columns 값으로 사용 가능
- Group 연산, 테이블 요약, 그래프 등을 위해 사용
- set_index로 계층적 색인 생성 후, unstack 메서드로 형태를 변경하는 과정의 축약형
p1.pivot?
p1.pivot(index=None, columns=None, values=None)
# index : index 색인으로 사용될 컬럼
# columns : column 색인으로 사용될 컬럼
# values : value에 채우고자 하는 컬럼
p1 = pd.read_csv('melt_ex.csv')
p1.pivot('year','mon') # 멀티인덱스로 생성
p1.set_index(['year','mon']).unstack('mon') # set_index로도 pivot 효과 가능
p1.pivot('year','mon','latte')
p1.pivot('year','mon')['latte']
p1.pivot('year','mon').xs(1,level=1,axis=1) # 1월 데이터
# 피벗 테이블 (.pivot_table)
- 테이블의 요약된 정보 출력
data.pivot_table?
data.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
# index : index 색인으로 사용될 컬럼
# columns : column 색인으로 사용될 컬럼
# aggfunc : 데이터 축약 시 사용할 함수 (mean, sum, count ...)
# margins : 행/열별 총 합
data = pd.read_csv('pivot_ex.csv')
data.pivot_table(index ='code', columns='product') # aggfunc의 default는 mean
data.pivot_table(index ='code',columns='product', aggfunc=sum)
data.pivot_table(index ='code',columns='product', aggfunc=sum, margins=True) # 행,열별 총합
#. Q1
# 1. sales 데이터를 불러와서
sales = pd.read_csv('sales.csv')
sales
sales.pivot('date','code')
# 1) 각 날짜별 판매량의 합계를 구하여라.
sales.pivot('date','code').sum(1) # pivot 메서드 사용
date
2018-01-01 162
2018-01-02 125
2018-01-03 231
2018-01-04 168
2018-01-05 207
2018-01-06 167
2018-01-07 26
dtype: int64
data = sales.set_index(['date','code']) # set_index 메서드 사용
data.sum(level=0)
# 2) 각 code별 판매량의 합계를 구하여라.
sales.pivot('date','code').sum(0)
code
qty c1 300
c2 315
c3 186
c4 285
dtype: int64
data = sales.set_index(['date','code'])
data.sum(level=1)
# 3) product 데이터를 이용하여 각 날짜별, 상품별 매출의 합계를 구하여라
prod = pd.read_csv('product.csv')
data3 = pd.merge(sales, prod, on='code')
data3['sales'] = data3['qty']*data3['price']
data3.pivot('date','code','sales').sum(0) # 상품(코드)별 매출 합계
code
c1 74700
c2 46935
c3 55800
c4 34200
dtype: int64
data3.pivot('date','code','sales').sum(1) # 날짜별 매출 합계
date
2018-01-01 29726
2018-01-02 23683
2018-01-03 40339
2018-01-04 40341
2018-01-05 39250
2018-01-06 33608
2018-01-07 4688
dtype: int64
#. Q2
# 1. sales2 데이터를 불러와서
sales = pd.read_csv('sales2.csv', encoding='cp949')
# 1) 데이터 형식 변환
data = sales.pivot_table(index=['날짜','지점'], columns='품목', values=['출고','판매'])
# 2) 위의 데이터에서 2018-01-03일 데이터만 출력
data.xs('2018-01-03') # level=0, axis=0
# 3) 위의 데이터에서 c2지점에 대한 데이터만 출력
data.xs('2018-01-03').loc['c2']
품목
출고 TV 1064
냉장고 1400
세탁기 1232
에어컨 1197
판매 TV 346
냉장고 457
세탁기 144
에어컨 635
Name: c2, dtype: int64
# 3-1) 전체 데이터에서 c2지점에 대한 데이터만 출력
data.xs('c2',level=1)
# 4) 위의 데이터에서 2018-01-02일에 c2지점의 세탁기의 판매량 출력
data.loc[('2018-01-02','c2'), ('판매','세탁기')]
745
# 5) 각 지점별 판매량의 평균값 출력
data['판매'].mean(axis=0, level=1).mean(axis=1)
지점
c1 561.416667
c2 561.666667
c3 526.583333
dtype: float64
#. Q3
# subway.csv 파일을 이용하여 다음을 수행
subway = pd.read_csv('subway.csv', encoding = 'cp949')
1) 각 노선번호 별 승차와 하차의 합 구하기
subway.pivot_table(index = '노선번호', values = ['승차','하차']).sum(axis=1)
노선번호
line_1 954889.00
line_2 4768852.30
line_3 1651980.30
line_4 1993235.50
line_5 1059013.15
line_6 1993235.50
line_7 2010750.65
line_8 1838368.75
dtype: float64
2) 지하철 운영 회사별 승하차에 대한 평균값 구하기
** 서울메트로(2,4호선), 코레일(1,3호선), 도시철도공사(5,6,7,8)
subway.loc[:,'line_no'] = subway.loc[:,'노선번호'].map(lambda x : int(x.split('_')[1])) # 노선번호 추출 후 새로운 컬럼에 저장
line_owner = {1: '코레일' , 2 : '서울메트로' , 3 : '코레일' , 4 : '서울메트로' , # dictionary 구조에 그룹별 치환 값 저장
5: '도시철도공사', 6 : '도시철도공사' , 7 : '도시철도공사' , 8 : '도시철도공사' } ;
subway['관리사'] = subway['line_no'].map(line_owner)
# 운영 회사별 승하차 평균
subway.pivot_table(index = '관리사', values = ['승차','하차']).mean(axis=1)
관리사
도시철도공사 8.626710e+05
서울메트로 1.690522e+06
코레일 6.517173e+05
dtype: float64
참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성과정
'Python > Process' 카테고리의 다른 글
[Python] 정규표현식 (re Module) (0) | 2019.02.18 |
---|---|
[Python] DataFrame의 데이터 변형 메서드 (0) | 2019.02.15 |
[Python] 데이터 결합 (np.concatenate, pd.concat) (0) | 2019.02.14 |
[Python] 데이터 병합(Join) - pandas.merge (0) | 2019.02.14 |
[Python] DataFrame의 멀티인덱스와 멀티컬럼(Multi-index, Multi-column) (8) | 2019.02.12 |