판다스는 파이썬 라이브러리의 한 종류로 데이터 분석을 위한 기능을 탑재한 라이브러리다. 보통 pd라는 별칭으로 호출된다.
Series : 행, 열과 같은 1차원 구조
Series로 만들기(튜플, 리스트, 넘파이배열(array)를 받는다)
data = ["안녕","하세","요"]
result = pd.Series(data)
index : 일반적인 index와 딕셔너리 key 성질을 합친 느낌이다. 디폴트값으로 0,1,2... 의 숫자값이 부여되고 따로 설정할 경우 딕셔너리의 key처럼 직접 인덱스명을 설정할 수 있다. 즉, 하나의 데이터는 index명과 index(정수0,1,2...) 두 가지 값을 가지는 것이다.
data = ["안녕","하세","요"]
result = pd.Series(data, index=["첫번째","두번째","세번째"])
result.index=[바꿀인덱스명들] # 모든 인덱스를 적어줘야 한다. 특정 인덱스명만 바꾸려면 다른 방식 이용해야 한다.
indexing : Series 원소 중 한 개만 호출
Series객체명[index명 / index] # 이 방법은 기본적으로 index명으로 조회를 하게 된다. index명에 존재하지 않으면 그 뒤에 index에서 찾는다.
# 예를 들어 index명이 100이고 index는 0 인 value값은 "Series객체명[100]"으로 호출해야 조회가 된다. 이때 index명대신 index로 조회하고 싶다면
# "Series객체명.iloc[index]" 로 조회해야 한다. 즉, "Series객체명[100]" 과 "Series객체명.iloc[0]"는 같은 것이다.
Series객체명[[index명1,index명2,index명3,...]]
slicing : Series 원소 중 일부분 잘라내기
Series객체명[start index : end index : step] # start 이상 end 미만
# 혹은
Series객체명[start index명 : end index명 : step] # start 이상 end 이하
이때 조심해야 할 것이 파이썬에서 list의 slicing은 deep copy지만, pandas의 Series의 slicing은 shallow copy로 원본이 바뀌면 슬라이싱한 부분도 같이 바뀌게 된다. 만약 deep copy하고 싶다면 copy()를 사용한다.
s=pd.Series([1,2,3,4,5])
s2=s[2:].copy()
print(s,s2)
# 출력결과 : 1,2,3,4,5 3,4,5
# copy메서드로 deep copy 실행함
print("_________________________________")
s[3]=99
print(s,s2)
# 출력결과 : 1,2,3,99,5 3,4,5
# 즉, deep copy가 되어 서로 영향을 주지 않음
boolean 연산 : True나 False를 이용해 True인 값들만 뽑아내는 방식. and,or,not 대신 &,|,~ 를 사용한다.
import numpy as np
s=pd.Series(np.random.randint(10,20,20))
s[(s > 15) & (s < 18) ] # s에서 해당조건을 만족하는(True인) 값들만 반환
np.where((s > 15) & (s < 18)) # s에서 해당조건을 만족하는 값들의 index값들을 array로 반환
head / tail 메서드 : 앞에서 혹은 뒤에서부터 지정한 개수만큼 반환(디폴트값 : 5개)
size 속성 : 데이터 개수 반환
dtype 속성 : value 타입 반환
astpye 메서드 : value 타입 변경해서 새로운 Series객체로 반환
sort_values 메서드 : 값을 기준으로 오름차순 정렬 후 새로운 Series객체로 반환
sort_index 메서드 : index명을 기준으로 오름차순 정렬 후 새로운 Series객체로 반환
isin 메서드 : iterable(리스트, 튜플 등)을 매개변수로 받아 해당 값들이 Series에 있는지 없는지 확인 후 True, False 값으로 Series객체 반환( (Series객체명==체크값1) | (Series객체명==체크값2) | ... 와 같다 )
통계 메서드
결측치 메서드
Dataframe : 행렬과 같은 2차원 구조
데이터프레임["새로운 컬럼명"] = ["새로운 값"]
데이터프레임.insert(columns, # 새로운 컬럼을 추가해줄 컬럼 위치
columns명, # 새로운 컬럼명
value # 새로운 값
)
데이터프레임.loc["인덱스"] = ["새로운 값"]
새롭게 넣어줄 데이터프레임명 = pd.DataFrame(["새로운값"],
columns = 데이터프레임명.columns
)
데이터프레임명.concat(
[
데이터프레임명.iloc[:n], # 해당 데이터프레임에서 n-1인덱스까지 +
새롭게 넣어줄 데이터프레임명, # 넣어줄 데이터프레임 +
데이터프레임명.iloc[n:] # 해당 데이터프레임에서 n인덱스부터 끝까지 +
],
ignore_index = False # 기존 index를 유지할지 여부
)
데이터프레임명.drop(columns="컬럼명", # 삭제할 컬럼명
index="index명", # 삭제할 index명
inplace=False # 기존 데이터프레임에 반영할지 여부
)
rename() : 특정 index명, columns명 변경하기
< 사용방법 >
데이터프레임명.rename(index={}, # key로 기존index명 value로 바꿀index명
columns={}, # key로 기존column명 value로 바꿀column명
inplace=False # 기존 데이터프레임에 반영할지 여부
)
rename_axis() : index나 columns가 무엇을 나타내는지에 대한 이름 변경하기
(인덱스명이 사과, 수박, 참외라면 rename_axis로 인덱스는 과일이라는 이름을 줄 수 있다.)
< 사용방법 >
데이터프레임명.rename_axis(mapper, # 이름부여
axis, # axis 선택
inplace=False # 기존 데이터프레임에 반영할지 여부
)
set_index() : index를 변경하기. 이때 전체적으로 변경도 가능하고 특정 인덱스만 골라서 변경도 가능하다.
< 사용방법 >
데이터프레임명.set_index(keys, # index로 사용할 컬럼명
drop=True, # key로 받은 컬럼을 지울지 여부
append=False, # 기존 index 삭제 여부
inplace=False, # 기존 데이터프레임에 반영할지 여부
verify_integrity=False # index 중복 체크 여부
)
reset_index() : 기존 index를 삭제하기. 이때 index를 컬럼으로 빼낼 수도 있고 그냥 삭제할 수도 있다.
< 사용방법 >
데이터프레임명.reset_index(level=None, # 디폴트값은 None으로 모두 지운다. 멀티 인덱스일 경우 지울 level 설정
drop=False, # 디폴트값은 False로 삭제된 index는 컬럼에 추가된다. 이때 컬럼에 추가시키고 싶지 않다면 True 처리한다
inplace=False, # 기존 데이터프레임에 반영할지 여부
col_level=0,
col_fill=''
)
value_counts() : feature별 데이터 개수 세기
< 사용방법 >
데이터프레임.value_counts(dropna=True, # 결측치도 세는지 설정
ascending=True, # 오름차순 설정
normalize=True, # 비율로 반환할지 설정
bins=n # 연속형자료의 경우 n만큼 구간을 나눠 세준다)
groupby : dsfsdf
filter() :
transform() : 집계함수를 통한 결과를 추가할 때 유용하다.(평균값 컬럼을 추가 or 개수 컬럼을 추가 ...) transform()은 집계함수 결과를 해당 칸(값)에 대신 넣어서 새로운 데이터프레임을 반환한다.
< 사용방법 >
groupby처리된데이터프레임.transform(func, # 집계함수같이 groupby된 데이터프레임의 Series에 적용할 함수
*args # 앞선 func함수의 매개변수
)
ex) 예시 : 데이터(레코드)별 해당 직업의 총 인원 컬럼 추가해주기
test = pd.DataFrame({
"직업":["선생님","선생님","학생","학생","무직"],
"이름":["A","B","C","D","E"]
})
=> test 출력
직업 | 이름 | |
---|---|---|
0 | 선생님 | A |
1 | 선생님 | B |
2 | 학생 | C |
3 | 학생 | D |
4 | 무직 | E |
result = test.groupby("직업")
result2 = result.transform("count")
=> result2 출력
이름 | |
---|---|
0 | 2 |
1 | 2 |
2 | 2 |
3 | 2 |
4 | 1 |
test["해당직업을 가진 인원수"] = result2
=> test 출력
직업 | 이름 | 해당직업을 가진 인원수 | |
---|---|---|---|
0 | 선생님 | A | 2 |
1 | 선생님 | B | 2 |
2 | 학생 | C | 2 |
3 | 학생 | D | 2 |
4 | 무직 | E | 1 |
pivot_table() : groupby는 그룹으로 설정한 컬럼들이 모두 인덱스 쪽에 표시되어 결과값이 굉장히 길게 표시될 수 있다.(ex. 나이별, 성별 groupby 결과 ==> index에 (10대,남),(10대,여),(20대,남),(20대,여)... ) 이때 그룹으로 설정한 컬럼들을 컬럼에도 표시할 수 있게해(ex. index에 (10대),(20대) columns에 (남),(여) 이런식으로 표현 가능) groupby 결과값을 더 쉽게 확인할 수 있게 커스터마이징할 수 있는 것이 pivot_table이다.
< 사용방법 >
데이터프레임명.pivot_table(
values="체크할컬럼명",
index="피봇테이블 인덱스로 사용할 이름",
columns="피봇테이블 컬럼으로 사용할 이름",
aggfunc=["집계함수명"],
fill_value="결측치에 대입할 값",
dropna=True, # 결측치 삭제할지 여부
margins=True, # 합계에 대한 표시 여부
margins_name="피봇테이블 합계컬럼,인덱스로 사용할 이름"
)
ex) 예시 : flights 데이터프레임에서 AIRLINE별, ORG_AIR별 CANCELLED의 총합값을 확인하고 싶을 때
flights.pivot_table(
values="CANCELLED",
index="AIRLINE", ############# 인덱스명으로 사용됨 ###########
columns="ORG_AIR", ############## 컬럼명으로 사용됨 ###########
aggfunc=["sum"],
fill_value=999,
margins=True,
dropna=True,
margins_name='All'
)
AIRLINE | ('sum', 'ATL') | ('sum', 'DEN') | ('sum', 'DFW') | ('sum', 'IAH') | ('sum', 'LAS') | ('sum', 'LAX') | ('sum', 'MSP') | ('sum', 'ORD') | ('sum', 'PHX') | ('sum', 'SFO') | ('sum', 'All') |
---|---|---|---|---|---|---|---|---|---|---|---|
AA | 3 | 4 | 86 | 3 | 3 | 11 | 3 | 35 | 4 | 2 | 154 |
AS | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B6 | 999 | 0 | 0 | 999 | 0 | 0 | 999 | 0 | 0 | 1 | 1 |
DL | 28 | 1 | 0 | 0 | 1 | 1 | 4 | 0 | 1 | 2 | 38 |
EV | 18 | 6 | 27 | 36 | 999 | 999 | 6 | 53 | 0 | 999 | 146 |
F9 | 0 | 2 | 1 | 0 | 1 | 1 | 1 | 4 | 0 | 0 | 10 |
HA | 999 | 999 | 999 | 999 | 0 | 0 | 999 | 999 | 0 | 0 | 0 |
MQ | 5 | 999 | 62 | 0 | 999 | 0 | 0 | 85 | 999 | 999 | 152 |
NK | 1 | 1 | 6 | 0 | 1 | 1 | 3 | 10 | 2 | 999 | 25 |
OO | 3 | 25 | 2 | 10 | 0 | 15 | 4 | 41 | 9 | 33 | 142 |
UA | 2 | 9 | 1 | 23 | 3 | 6 | 2 | 25 | 3 | 19 | 93 |
US | 0 | 0 | 2 | 2 | 1 | 0 | 0 | 6 | 7 | 3 | 21 |
VX | 999 | 999 | 999 | 999 | 0 | 3 | 999 | 0 | 999 | 3 | 6 |
WN | 9 | 13 | 999 | 999 | 7 | 32 | 1 | 999 | 6 | 25 | 93 |
All | 69 | 61 | 187 | 74 | 17 | 70 | 24 | 259 | 32 | 88 | 881 |
apply() : 모든 데이터에 대한 일괄 처리가 필요할 때 많이 사용한다.
< 사용방법 >
# Series / DataFrame 사용가능
# DataFrame 기준으로 설명
데이터프레임명.apply(함수명,
axis=기준축(0,1 ...), # 디폴트값: 0
args=함수에 필요한 매개변수들(튜플형식) or **kwarg(함수 에 필요한 매개변수들 키워드 인자 형식)
)
ex) 예시 : 특정 컬럼들의 값들에만 모두 +10 해주기
test = pd.DataFrame({
"A":[1,2,3,4,5],
"B":[1,2,3,4,5],
"C":[1,2,3,4,5],
})
=> test 출력
A | B | C | |
---|---|---|---|
0 | 1 | 1 | 1 |
1 | 2 | 2 | 2 |
2 | 3 | 3 | 3 |
3 | 4 | 4 | 4 |
4 | 5 | 5 | 5 |
여기서 A컬럼과 C컬럼 데이터들에만 +10을 해준다.
1) 람다식 사용방식
test[["A","C"]] = test[["A","C"]].apply(lambda x:x+10)
2) 일반함수 사용방식
def func(x,val):
return x+val
test[["A","C"]] = test[["A","C"]].apply(func, axis=0, val=10)
=> test 출력
A | B | C | |
---|---|---|---|
0 | 11 | 1 | 11 |
1 | 12 | 2 | 12 |
2 | 13 | 3 | 13 |
3 | 14 | 4 | 14 |
4 | 15 | 5 | 15 |
cut() / qcut() : 지정한 값을 기준으로 구간(범위)을 나눠줄 수 있다.
cut은 범위 기준으로, qcut은 개수를 기준으로 나눠준다. 예를 들어 1~100범위에 총 10개 데이터가 존재할 때 2부분으로 cut을 하면 1~50, 50~100으로 나뉘고 2부분으로 qcut을 하면 데이터 5개, 데이터 5개로 나뉘게 된다.
< 사용방법 >
pd.cut(x, # x는 Series나 list같은 1차원 자료구조
bins, # 리스트 or 정수, 리스트일경우 구간의 경계값들 포함하고 정수일 경우 지정한 개수만큼 동일한 범위로 구간 나눈다
right=True, # 디폴트값 True로 구간경계의 오른쪽값을 포함하는지 여부 결정
lables=[] # 구간의 이름들을 담은 리스트 형식
)
pd.qcut(x, # x는 Series나 list같은 1차원 자료구조
q, # 정수로 나눌 구간의 개수를 지정한다
labels=[] # 구간의 이름들을 담은 리스트 형식
)
ex) 예시 : 키를 기준으로 작은 키,중간 키,큰 키 범위 나눠 표시하기
test = pd.DataFrame({
"이름":["홍길동","이순신","세종대왕","을지문덕","염라대왕","예수",],
"키":[170,160,162,175,180,188]
})
=> test 출력
이름 | 키 | |
---|---|---|
0 | 홍길동 | 170 |
1 | 이순신 | 160 |
2 | 세종대왕 | 162 |
3 | 을지문덕 | 175 |
4 | 염라대왕 | 180 |
5 | 예수 | 188 |
height_category = pd.cut(test["키"],
3,
right=False,
labels=["작음","중간","큼"]
)
=> height_category 출력
0 중간
1 작음
2 작음
3 중간
4 큼
5 큼
test["키범위"]=height_category
=> test 출력
이름 | 키 | 키범위 | |
---|---|---|---|
0 | 홍길동 | 170 | 중간 |
1 | 이순신 | 160 | 작음 |
2 | 세종대왕 | 162 | 작음 |
3 | 을지문덕 | 175 | 중간 |
4 | 염라대왕 | 180 | 큼 |
5 | 예수 | 188 | 큼 |
concat() : 단순하게 데이터프레임을 합치는 방식이다. 컬럼명이 같은 열끼리 합치고, index명이 같은 행끼리 합친다. 즉, 같은 구조를 가진 데이터프레임을 합치는 느낌이다.
< 사용방법 >
pd.concat(objs, # 합칠 데이터프레임들 리스트
keys=[], # 합쳐진 행들을 구분하기 위한 추가 인덱스들 리스트
axis=0, # 디폴트값은 0으로 합칠 기준축을 설정
join='outer',
ignore_index=True # 디폴트값은 False로 index명은 가져오지 않고 모두 새롭게 0부터 부여할지 여부 결정한다
) # 디폴트값은 outer로 합치는 컬럼이나 인덱스에 대한 차이가 있을 경우 처리 방식을 설정
ex) 예시 : 2016, 2017년도 데이터프레임 합치기
s_2016, s_2017 데이터프레임이 다음과 같다고 가정한다.
=> s_2016 출력
Symbol | Shares | Low | High | |
---|---|---|---|---|
0 | AAPL | 80 | 95 | 110 |
1 | TSLA | 50 | 80 | 130 |
2 | WMT | 40 | 55 | 70 |
=> s_2017 출력
Symbol | Shares | Low | High | |
---|---|---|---|---|
0 | AAPL | 50 | 120 | 140 |
1 | GE | 100 | 30 | 40 |
2 | IBM | 87 | 75 | 95 |
3 | SLB | 20 | 55 | 85 |
4 | TXN | 500 | 15 | 23 |
5 | TSLA | 100 | 100 | 300 |
result = pd.concat([s_2016,s_2017],keys=[2016,2017])
=> result 출력
Symbol | Shares | Low | High | |
---|---|---|---|---|
(2016, 0) | AAPL | 80 | 95 | 110 |
(2016, 1) | TSLA | 50 | 80 | 130 |
(2016, 2) | WMT | 40 | 55 | 70 |
(2017, 0) | AAPL | 50 | 120 | 140 |
(2017, 1) | GE | 100 | 30 | 40 |
(2017, 2) | IBM | 87 | 75 | 95 |
(2017, 3) | SLB | 20 | 55 | 85 |
(2017, 4) | TXN | 500 | 15 | 23 |
(2017, 5) | TSLA | 100 | 100 | 300 |
join() : 조인을 통해 데이터프레임을 합치는 방식이다. 위에서 설명한 단순한 데이터프레임 합치기 방식인 concat()은 join의 full outer join 방식이라고 생각할 수 있다. 조인은 인덱스를 기준으로 서로 다른 데이터프레임(컬럼이 다른)을 합치는 방식이다. 즉, 조인의 핵심은 인덱스를 비교하고 싶은 값으로 변경한 후 조인하는 것이다.
< 사용방법 >
데이터프레임1.join(데이터프레임2,
how="left", # 디폴트값은 left로 join 방식을 설정(left,right,inner)
lsuffix="_1", # 컬럼명이 같을 경우 데이터프레임1 컬럼명 뒤에 붙일 이름
rsuffix="_2" # 컬럼명이 같을 경우 데이터프레임2 컬럼명 뒤에 붙일 이름
)
ex) 예시 : 같은 컬럼의 값을 기준으로 join하기
s_2016, s_info 데이터프레임이 다음과 같다고 가정한다.
=> s_2016 출력
Symbol | Shares | Low | High | |
---|---|---|---|---|
0 | AAPL | 80 | 95 | 110 |
1 | TSLA | 50 | 80 | 130 |
2 | WMT | 40 | 55 | 70 |
=> s_info 출력
Symbol | Name | |
---|---|---|
0 | AAPL | Apple Inc |
1 | TSLA | Tesla Inc |
2 | WMT | Walmart Inc |
3 | GE | General Electric |
4 | IBM | IBM(International Business Machines Co) |
5 | SLB | Schlumberger Limited. |
6 | TXN | Texas Instruments Incorporated |
7 | AMZN | Amazon.com, Inc |
이때 우린 Symbol값(AAPL, TSLA, WMT ...)들을 이용해 join시켜 볼 것이다. 위에서 join은 인덱스를 기준으로 비교한다고 했으므로 해당 Symbol컬럼을 인덱스로 만들어준다.
s_2016.set_index("Symbol",inplace=True)
s_info.set_index("Symbol",inplace=True)
=> s_2016 출력
Symbol | Shares | Low | High |
---|---|---|---|
AAPL | 80 | 95 | 110 |
TSLA | 50 | 80 | 130 |
WMT | 40 | 55 | 70 |
=> s_info 출력
Symbol | Name |
---|---|
AAPL | Apple Inc |
TSLA | Tesla Inc |
WMT | Walmart Inc |
GE | General Electric |
IBM | IBM(International Business Machines Co) |
SLB | Schlumberger Limited. |
TXN | Texas Instruments Incorporated |
AMZN | Amazon.com, Inc |
s_info.join(s_2016)
디폴트값이 left 조인이 실행되어 s_info의 모든 인덱스는 그대로 나오고 해당 인덱스와 같은 값을 지닌 s_2016의 인덱스들만 조인되었다. 그리고 컬럼명은 중복되는 것이 없어 lsuffix나 rsuffix는 설정하지 않았다.
=> 조인 출력
Symbol | Name | Shares | Low | High |
---|---|---|---|---|
AAPL | Apple Inc | 80 | 95 | 110 |
TSLA | Tesla Inc | 50 | 80 | 130 |
WMT | Walmart Inc | 40 | 55 | 70 |
GE | General Electric | nan | nan | nan |
IBM | IBM(International Business Machines Co) | nan | nan | nan |
SLB | Schlumberger Limited. | nan | nan | nan |
TXN | Texas Instruments Incorporated | nan | nan | nan |
AMZN | Amazon.com, Inc | nan | nan | nan |
merge() : 위에서 설명한 조인과 비슷하다. 다른점은 join은 인덱스를 기준으로 합치지만 merge는 컬럼명을 기준으로 합친다.(인덱스를 기준으로 합칠 수도 있음)
< 사용방법 >
데이터프레임1.merge(데이터프레임2,
how='inner', # 디폴트값 inner로 조인방식 설정(right,left,inner)
on="컬럼명", # 조인할 공통 기준 컬럼명 설정
left_on=None, # 조인할 데이터프레임1 기준 컬럼명 설정
right_on=None, # 조인할 데이터프레임2 기준 컬럼명 설정
left_index=False, # 조인할 데이터프레임1 기준 인덱스 사용 여부
right_index=False, # 조인할 데이터프레임2 기준 인덱스 사용 여부
suffixes=["_1","_2"] # 디폴트값 _x, _y으로 중복된 컬럼에 대한 suffix처리할 수 있는 리스트
)
ex) 예시 : 같은 컬럼의 값을 기준으로 merge하기
s_2016, s_info 데이터프레임이 다음과 같다고 가정한다.
=> s_2016 출력
Symbol | Shares | Low | High | |
---|---|---|---|---|
0 | AAPL | 80 | 95 | 110 |
1 | TSLA | 50 | 80 | 130 |
2 | WMT | 40 | 55 | 70 |
=> s_info 출력
Symbol | Name | |
---|---|---|
0 | AAPL | Apple Inc |
1 | TSLA | Tesla Inc |
2 | WMT | Walmart Inc |
3 | GE | General Electric |
4 | IBM | IBM(International Business Machines Co) |
5 | SLB | Schlumberger Limited. |
6 | TXN | Texas Instruments Incorporated |
7 | AMZN | Amazon.com, Inc |
join 예시에서는 이 상황에서 해당 컬럼들을 인덱스로 바꾸고 join 해줬다. 하지만 merge는 이 상태 자체에서 merge가 가능하다.
s_2016.merge(s_info, on="Symbol", how="right")
right join이 되어 s_info가 기준테이블로 잡히고 양쪽 데이터프레임에서 "Symbol"이란 컬럼명을 서로 join시키게 된다.
Symbol | Name | Shares | Low | High | |
---|---|---|---|---|---|
0 | AAPL | Apple Inc | 80 | 95 | 110 |
1 | TSLA | Tesla Inc | 50 | 80 | 130 |
2 | WMT | Walmart Inc | 40 | 55 | 70 |
3 | GE | General Electric | nan | nan | nan |
4 | IBM | IBM(International Business Machines Co) | nan | nan | nan |
5 | SLB | Schlumberger Limited. | nan | nan | nan |
6 | TXN | Texas Instruments Incorporated | nan | nan | nan |
7 | AMZN | Amazon.com, Inc | nan | nan | nan |
to_frame() : 시리즈에서 데이터프레임으로 바꾸기
< 사용방법 >
a=pd.Series([1,2,3,4,5])
a.to_frame()
=> a 출력
0 | |
---|---|
0 | 1 |
1 | 2 |
2 | 3 |
3 | 4 |
4 | 5 |
즉, 시리즈가 아닌 데이터프레임 형태로 출력되는 모습을 확인할 수 있다.
stack() / unstack() : stack은 컬럼을 인덱스로 unstack은 인덱스를 컬럼으로 만들어준다. 이때 기존에 존재하던 컬럼이나 인덱스가 있다면 stack이나 unstack으로 바꿔준 새로운 인덱스나 컬럼은 기존 인덱스나 컬럼 하위로 들어가 멀티 인덱스, 멀티 컬럼 형태가 된다. 반대로 stack이나 unstack으로 멀티 인덱스나 멀티 컬럼에 사용하면 하위 단계 인덱스나 컬럼부터 변경된다.
< 사용방법 >
데이터프레임명.stack()
데이터프레임명.unstack()
melt() : 컬럼을 녹여서 값으로 바꿔주는 함수다. 즉, 컬럼으로 분류되어 있던 컬럼명들을 값들로 바꿔 일일이 데이터(레코드)에 넣어주는 것이다.
< 사용방법 >
데이터프레임명.melt(id_vars=[], # 유지할 컬럼명
value_vars=[], # 값으로 녹여낼 컬럼명
var_name="값이 된 컬럼명을 가지는 컬럼명",
value_name="기존 값을 가지는 컬럼명",
)
pivot() : 데이터 프레임에서 두 개 이상의 범주형 변수를 그룹으로 묶어 특정 값을 보려고 할때 사용할 수 있다.
< 사용방법 >
데이터프레임.pivot(index="state",
columns="fruit",
values="count"
)