본문 바로가기
개발일지/Pandas

pandas 판다스 기초 6

by 다니엘의 개발 이야기 2022. 7. 16.
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