320x100
# reset_index()의 기능의 근본은
# 'index_col자리에 index 기준값이 된 것을 해제해준다.'라는 개념같다.
# 즉, index_col을 설정해주기 전의 모습으로 돌아가는 것이다.
# Pandas Index Objects
## First Steps
import pandas as pd
summer = pd.read_csv('summer.csv', index_col = 'Athlete')
summer.tail()
summer.index[0]
# 'HAJOS, Alfred'
# 모든 인덱스가 고유값인지 판단할 때 쓰이는 함수 (중복되지 않은 인덱스인지 확인)
summer.index.is_unique
# False
summer.index.get_loc('DRIVAS, Dimitrios')
# 2
# 인덱스 값이 2 즉, 3번째에 위치한 값이라는 뜻이다. get_loc에 들어있는 DRIVAS, Dimitrios 라는 값은
## Creating Index Objects
import pandas as pd
list_1 = [1,2,3]
pd.Index(list_1)
# Int64Index([1, 2, 3], dtype='int64')
# 인덱스의 형태와 데이터 타입을 리턴해준다.
pd.index(list_1)
# AttributeError: module 'pandas' has no attribute 'index'
# 대소문자를 구분에 주의해야한다. pd.Index (0), pd.index (x)
list_2 = ['m', 't', 'w']
pd.Index(list_2)
# Index(['m', 't', 'w'], dtype='object')
index_1 = pd.Index(range(1,4))
index_1
# RangeIndex(start=1, stop=4, step=1)
index_2 = pd.Index(['Mo', 'Tue', 'Wed'], name = 'days')
index_2
# Index(['Mo', 'Tue', 'Wed'], dtype='object', name='days')
pd.Series([34,32,21], index = index_2)
'''
days
Mo 34
Tue 32
Wed 21
dtype: int64
'''
pd.Series([34,32,21], index = index_1)
'''
1 34
2 32
3 21
dtype: int64
'''
## Changing Row Index Labels
summer = pd.read_csv('summer.csv', index_col = 'Athlete')
summer.head(2)
summer.index
# RangeIndex(start=0, stop=31165, step=1)
summer.reset_index()
# 이렇게 해주면, 기존의 인덱스 앞에 새로 리셋된 인덱스가 하나더 추가된다.;
# 하지만 기본적으로 reset_index()는 ()안에 drop = False 라고 입력되어있는 상태이다. 즉
# drop = True로 해주면,
summer.reset_index(drop=True)
# 기존의 0번째 열값을 아예 삭제해버리고, 그 자리에 숫자로된 순서 인덱스가 들어간다.
# 물론, 이게 유지가 되는 것은 아니고, 보여지는 현상이다. 따라서 이렇게 변화된 값으로 가지고 가고 싶다면
# ()안에, inplace=True를 해줘야한다.
# ********* 매우 중요 **********8
# read_csv로 값을 불러올 때에 index_col로 이미 index값이 설정되어있을 경우에
# 다른 인덱스를 기준으로 바꿔주고 싶을 경우에 이용하면 된다.
# 기존에 index_col = 'Athlete'로써 Athlete를 기준으로 사용중이였는데, 이것을 Year 를 기준으로 바꿔주는 것이다.
summer.set_index('Year')
# 그런데 이렇게 해결해서 끝내버리면 기존의 기준 index로 사용하고 있던 Athlete는 사라지게 된다.
# 이를 위해서
# reset_index를 해주고
summer.reset_index(inplace=True)
# 다시 set_index를 해주면 Athlete는 살아나게 되고, Year가 기준값으로 잡히게 된다.
summer.set_index('Year', inplace=True)
'''
Athlete City Sport Discipline Country Gender Event Medal
Year
1896 HAJOS, Alfred Athens Aquatics Swimming HUN Men 100M Freestyle Gold
1896 HERSCHMANN, Otto Athens Aquatics Swimming AUT Men 100M Freestyle Silver
1896 DRIVAS, Dimitrios Athens Aquatics Swimming GRE Men 100M Freestyle For Sailors Bronze
1896 MALOKINIS, Ioannis Athens Aquatics Swimming GRE Men 100M Freestyle For Sailors Gold
1896 CHASAPIS, Spiridon Athens Aquatics Swimming GRE Men 100M Freestyle For Sailors Silver
... ... ... ... ... ... ... ... ...
2012 JANIKOWSKI, Damian London Wrestling Wrestling Freestyle POL Men Wg 84 KG Bronze
2012 REZAEI, Ghasem Gholamreza London Wrestling Wrestling Freestyle IRI Men Wg 96 KG Gold
2012 TOTROV, Rustam London Wrestling Wrestling Freestyle RUS Men Wg 96 KG Silver
2012 ALEKSANYAN, Artur London Wrestling Wrestling Freestyle ARM Men Wg 96 KG Bronze
2012 LIDBERG, Jimmy London Wrestling Wrestling Freestyle SWE Men Wg 96 KG Bronze
31165 rows × 8 columns
'''
# 위를 간단하게 정리하자면
summer.reset_index().set_index('Year')
# 이렇게 된다.
# reset_index()를 해준 후에 set_index()를 해주는 개념이라고 보면 된다.
# 위에서 확인할떄, 당연한것이기도 하지만 Year에 중복값이 너무 많음을 발견했다. 1896, 2012 등등
# 이렇게 중복값이 많은지 확인해줄때 다시
summer.index.is_unique
summer.index[0]
# 1896
# 위의 summer.index 0번째의 값은 1896이다. 이를 바꿔주길 원한다면 보통 summer.index[0] = x 로 x에 내가 변경을 희망하는 값을 넣어주면 되는데
summer.index[0] = 1864
# TypeError: Index does not support mutable operations
# 라는 에러가 생기게 된다. 쉽게, index 변경이 안된다는 문구이다.
# 하지만, 정확히 index의 사이즈를 알고, 그것과 동일하게 변경을 해준다면, 즉, index의 총 수량이 그대로 유지가 된다면
# 변경이 가능하다.
# 그것을 위해서 우선은 체크해주자.
summer.index.size
# 31165
# 새로운 index를 위한 comprehension을 만들어주자.
new_index = ['Medal_No{}'.format(i) for i in range(1,summer.index.size+1)]
new_index
summer.index = new_index
summer.head()
# 인덱스 변경이 되었다.
# 이런경우, 인덱스 변경이 가능한 사유는 "통째"로 바꾸는 방법이 있는것같다.
# 형식이 구겨지기 때문일까? 이를테면 object 형태와 int형태라든지 float형태가 섞여 있을수도 있으니 말이다.
summer.index.is_unique
# True
summer.index.name = 'Medal_No'
summer.head(2)
'''
Athlete City Sport Discipline Country Gender Event Medal
Medal_No
Medal_No1 HAJOS, Alfred Athens Aquatics Swimming HUN Men 100M Freestyle Gold
Medal_No2 HERSCHMANN, Otto Athens Aquatics Swimming AUT Men 100M Freestyle Silver
'''
# 정말 재미있는 index.name = ''라는 점은
# index_col 처럼 기준값으로 설정해준 값의 자리에 해당하는 것이 name이고, index.name 은 그 자리의 값을 출력해주는것이다.
# 즉, index.name으로 그 자리의 출력값은 하나의 변수가 되고, 거기에 값을 넣으면 그 값대로 변형된다.
## Changing Column Labels
titanic = pd.read_csv('titanic.csv')
titanic.head(2)
titanic.columns[0] = 'Alive'
# TypeError: Index does not support mutable operations
# 컬럼값을 변경해 주려고 했더니 index 에러가 뜬다.
len(titanic.columns)
# 9
# 하지만 이렇게 columns 길이가 9개니만큼, 9개를 재설정 해주자 재설정이 되었다.
# 이전의 행 index 변경과 마찬가지다.
# 행이든 열이든 index 변경시, 현재 해당되는 변수의 행길이, 혹은 열길이에 맞추어서 변경이 되어야할 값은 dict, tuple, list 형태로
# 준비가 되어있어야하며, 준비가 안되어있다면 반복문으로 이 리스트들을 먼저 만들어놓은 후에
# 한꺼번에 변경 요청을 해야 변경이 된다.
titanic.columns = ['Alive', 'Class', 'Sex', 'Age', 'SibSp', 'ParChi', 'Fare', 'Emb', 'Deck']
titanic.head(2)
# 컬럼의 이름값 (이것도 일종의 설정 인덱스 index_col 과 같은 위치에 놓일 값이다.)
titanic.columns.name = 'Pass_Charact'
titanic.head(2)
'''
Pass_Charact Alive Class Sex Age SibSp ParChi Fare Emb Deck
0 0 3 male 22.0 1 0 7.2500 S NaN
1 1 1 female 38.0 1 0 71.2833 C C
'''
titanic.index.name = 'Passenger_no'
titanic.head(2)
'''
Pass_Charact Alive Class Sex Age SibSp ParChi Fare Emb Deck
Passenger_no
0 0 3 male 22.0 1 0 7.2500 S NaN
1 1 1 female 38.0 1 0 71.2833 C C
'''
# 결과와 같이, 좀더 정확히는 titanic.columns.name = 로 설정된 값은 오른쪽으로 펼쳐질 컬럼의 메인 네임으로써 왼쪽 최상단에 위치하게 되고
# titanic.index.name = 으로 설정된 값은 왼쪽 하단으로 쭉 빠질 값의 메인 네임이 되므로 columns.name의 밑에 위치하게 된다.
summer.set_index('Athlete', inplace=True)
# 전체 값을 서치해서 {a:b}라고 할때, a에 해당하는 값을 찾아서 b로 바꿔줘라.
summer.rename(mapper = {"HAJOS, Alfred": 'HAYOS, Alfred'}, axis = 'index')
# 그러자면, 디테일하게 생각했을때 axis가 왜 필요할까? 싶다.
# 암튼 mapper는 찾아주는 것이고, rename은 단순히 ()에 입력된 값처럼 a to b로 전환해주는 기능이다.
# 내부의 값을 찾아내어서 변경하는 방법 1
# 전체 값을 서치해서 {a:b}라고 할때, a에 해당하는 값을 찾아서 b로 바꿔줘라.
summer.rename(mapper = {"HAJOS, Alfred": 'HAYOS, Alfred'},)
# 물론 변경을 희망한다면 inplace=True를 해줘야한다. 이거는 단순히 변경후의 모습을 체크하기 위한 참고자료밖엔 안된다.
# 그 외적으로는, 디테일하게 생각했을때 axis가 왜 필요할까? 싶다.
# 내부의 값을 찾아내어서 변경하는 방법 2
summer.rename(index = {'HAJOS, Alfred':'HAYOS, Alfred'}, inplace = True)
summer
# 내부의 값을 찾아내어서 변경하는 방법 1
summer.rename(mapper = {'Sex': 'Gender', 'City':'Host_City'}, axis = 'columns')
# 물론 변경을 희망한다면 inplace=True를 해줘야한다. 이거는 단순히 변경후의 모습을 체크하기 위한 참고자료밖엔 안된다.
# 내부의 값을 찾아내어서 변경하는 방법 2
summer.rename(columns = {'Sex':'Gender', 'City':'Host_City'}, inplace=True)
summer
300x250
'개발일지 > Pandas' 카테고리의 다른 글
pandas (판다스) 기초 7 filtering (0) | 2022.07.18 |
---|---|
pandas 판다스 틀린부분 복기 (0) | 2022.07.16 |
pandas 판다스 기초 5 (0) | 2022.07.15 |
pandas 판다스 기초 4 (0) | 2022.07.15 |
pandas (판다스) 기초3 (0) | 2022.07.15 |