2023. 4. 19. 20:28ㆍ프로그래밍/데이터분석
안녕하세요, 오늘은 지난번에 설명한 데이터프레임을 활용하여 데이터를 분석하고, 가공하는 법에 대해 알아보겠습니다.
오늘 사용할 예시 데이터 입니다.
import pandas as pd
example_data = {'Name': ['Daniel', 'Jude', 'Tim', 'Mac', 'Philip', 'Jordan', 'Bikram', 'Nancy'],
'대학': ['ANU', 'USYD', 'UC', 'UCLA', 'ANU', 'SNU', 'KAIST', 'POSTECH'],
'키': [180, 184, 168, 187, 188, 202, 188, 190],
'몸무게': [95, 80, 91, 73, 66, 85, 70, 95],
'용돈': [85, 30, 80, 60, 35, 100, 65, 85],
'학점': [4.5, 3.8, 3.3, 2.5, 1.5, 4.0, 4.5, 3.9],
'학과': ['컴퓨터과', '수학과', '국문과', '자율전공학과', '', '영문과', '경제학과', '의예과']}
df = pd.DataFrame(example_data, index = ['1번','2번','3번','4번','5번','6번','7번','8번'])
1. Index의 접근 및 조작
a. 인덱스 확인
데이터 프레임의 인덱스정보를 확인할때 사용합니다.
df.index
# Index(['1번', '2번', '3번', '4번', '5번', '6번', '7번', '8번'], dtype='object')
다음과 같이 인덱스번호를 저장한 리스트를 담고있는 객체를 리턴합니다.
b. 인덱스 이름설정
데이터프레임 인덱스컬럼에 이름을 설정하고 싶을 때 사용합니다.
df.index.name = '학번'
위 코드를 실행하게되면 맨처음 데이터 프레임과 다르게, 인덱스 컬럼에 "학번" 이라는 이름이 지정되게 됩니다.
c. 인덱스 초기화
직접 지정한 인덱스를 초기화하고, 판다스가 자동으로 지정해주는 인덱스를 사용하고싶을때 사용합니다.
df.reset_index() # 1
df.reset_index(drop=True) # 2
두 코드 모두 판다스가 자동으로 0번부터 인덱스를 다시 설정해주지만, drop 속성을 True로 지정해준다면, 기존에 사용하던 인덱스 컬럼을 삭제합니다.
하지만 인덱스 리셋시 주의사항이 있습니다. #1, #2 코드를 실행시키면 위 사진처럼 결과물을 출력하나, 다시 데이터프레임 원본 "df"를 출력하게된다면, 아래와 같은 결과물을 반환합니다.
실제 데이터프레임에는 reset_index()가 적용되지 않았는데, 이것을 적용을 시키려면 다음과 같은 코드를 추가해 주셔야합니다.
df.reset_index(inplace = True) # 1'
# df = df.reset_index()
df.reset_index(drop = True, inplace = True) # 2'
#df = df.reset_index(drop = True)
#1' 과 #2' 는 각각 #1, #2와 같은 동작을하나, 실제 원본데이터에 적용이 됩니다! (각각, 주석처리된 부분과 같은 동작을 하게됩니다.)
d. 인덱스 설정
별도의 추가 데이터입력 없이도 데이터프레임의 컬럼을 기준으로 인덱스를 설정할 수 있습니다.
df.set_index('키')
이렇게 데이터 프레임의 인덱스를 설정 할 수 있으나, 초기화를 할때처럼 데이터프레임에 직접 적용을 시켜주려면, inplace 속성값을 True로 설정을 해주셔야 적용 됩니다.
e. 인덱스를 통한 데이터 정렬
인덱스를 통해서 데이터프레임의 데이터를 정렬 할 수 있습니다.
df.sort_index() # 오름차순 기본값 : ascending = True
df.sort_index(ascending = False) # 내림차순
정렬한 결과도 원레 데이터프레임에 반영하고 싶다면, inplace 값을 True 로 설정하셔야 합니다!
2. 데이터 선택 (Data Selection)
a. 컬럼에 저장된 값 확인
데이터프레임의 컬럼을 통해 값들을 가져와 보는 법에 대해 알아보겠습니다.
df['Name'] # df['컬럼이름']
# 결과
0 Daniel
1 Jude
2 Tim
3 Mac
4 Philip
5 Jordan
6 Bikram
7 Nancy
df['Name'] 을 통해 Name 컬럼에 있는 모든 값들을 인덱스와 함께 가져올 수 있습니다. Name이 아니더라도 우리가 가진 예시 데이터프레임의 컬럼인, '대학', '키', '몸무게', '용돈', '학점', '학과' 또한 'Name' 대신 들어가 해당 컬럼의 데이터들을 가져올 수 있습니다.
df[['Name','학과']]
뿐만 아니라, 이렇게 리스트 형태로 컬럼들을 입력해준다면, 해당 컬럼 값의 데이터들을 한번에 가져오는 것 도 가능합니다.
b. 컬럼 선택
df.columns
# 결과
Index(['Name', '대학', '키', '몸무게', '용돈', '학점', '학과'], dtype='object')
df.columns[2]
# 결과
'키'
'.columns' 를 통해 데이터 프레임의 컬럼 이름들을 리스트형태로 확인 할 수 있고, 일반적인 파이썬 리스트처럼 숫자형 인덱스로 접근하여 특정값만을 얻는 것 도 가능합니다.
이렇게 얻은 값을 '2 - a'에서 컬럼에 저장되어 있는 데이터를 가져오는 것도 가능합니다.
df[df.columns[0]]
# 결과
0 Daniel
1 Jude
2 Tim
3 Mac
4 Philip
5 Jordan
6 Bikram
7 Nancy
그런 점에서 위의 코드는 '2-a' 의 예제와 동일하게 동작합니다.
c. 데이터 슬라이싱
지난번, 데이터 프레임은 2차원적으로 데이터를 저장할 수 있는 구조라고 말씀 드렸습니다.
그렇기 때문에 2차원 리스트에 접근하듯이 접근하는 것이 가능합니다.
df[0:3] # 1 - 0번 row ~ 2번 row 반환
df[['Name','대학']][0:3] # 2 - 'Name' 과 '대학' 컬럼의 0번 row ~ 2번 row 반환
2차원 리스트와 한가지 다른점은, 이차원 리스트에서 #1 번처럼 접근했다면, 0번 컬럼부터 2번컬럼까지의 데이터가 나와야 하는 것이라고 생각 하실 수도 있지만, 2차원리스트와는 살짝 다르게 동작합니다.
d. loc를 통한 데이터 선택
이부분 부터는 살짝 복잡하게 느껴질 수 있습니다.
'loc' 는 데이터프레임의 속성중 하나로, 인덱스 값으로 해당하는 데이터를 찾게 도와줍니다. 인덱스 값이외에도 boolean 리스트 또한 인자로 받을 수 있으나 차후에 소개해 드리겠습니다.
지금 부터는 'Name' 컬럼을 인덱스로 지정한 데이터 프레임을 사용하겠습니다.
# 기본형 : df.loc[index, column]
df.loc['Jude'] # Jude row에 저장된 모든 컬럼의 데이터를 가져옵니다.
df.loc['Jude', '학과'] # Jude row의 학과컬럼의 데이터를 불러옵니다.
df.loc['Jude', ['학과', '용돈']] # Jude row의 학과와 용돈컬럼의 데이터를 불러옵니다.
df.loc['Jude', '용돈':'학과'] # Jude row의 용돈컬럼부터 학과 컬럼까지의 데이터를 불러옵니다.
df.loc[['Jude','Jordan']] # Jude 와 Jordan row에 저장된 모든 컬럼의 데이터를 불러옵니다.
df.loc[['Jude','Jordan'], '대학'] # Jude 와 Jordan row의 대학컬럼의 데이터를 불러옵니다.
df.loc[['Jude','Jordan'], ['대학', '용돈']] # Jude 와 Jordan row의 대학과 용돈컬럼의 데이터를 불러 옵니다.
df.loc['Jude':'Jordan'] # Jude ~ Jordan 까지의 row 의 모든컬럼의 데이터를 불러옵니다.
예시가 참많지만, 기본적으로 loc의 index 와 column 에 복수의 데이터를 넘길때 리스트의 형태로 넘길 수 있다는 점만 기억해주시고, 상황과 편의의 맞게 사용하시면 될 것 같습니다!
e. iloc를 통한 데이터 선택
loc가 인덱스 값을 기준으로 동작 했다면, iloc는 숫자형 자료 구조를 인자로 전달 받아 동작합니다.
여기서 숫자형 자료구조는 판다스가 데이터프레임 각 row의 기본적으로 설정하는 Index 번호라고 생각하시면 좋을 것 같습니다.
loc와 유사하게 동작하기 때문에 간단히 설명하겠습니다.
# 기본형 df.iloc[row_number, column_number]
df.iloc[5] # 5번째 row의 모든 컬럼에 저장된 데이터를 불러옵니다. (0부터 카운트)
df.iloc[5, [1:4]] # 5번째 row의 1번~3번 컬럼의 데이터를 불러옵니다. (행과열모두 0부터 카운트)
# row_number 와 column_number 는 int, [int1, int2], [int1 : int2]의 형식으로 전달할 수 있습니다.
# column_number 는 생략이 가능합니다.
f. 조건을 통한 데이터 선택
특정한 조건에 해당하는 데이터들만 선별하고 싶을때, 원하는 조건을 찾아서 데이터 프레임에 적용하면, 해당하는 데이터들만 불러 올 수 있습니다.
예시를 통해 살펴보겠습니다. 학점 3.5 이상인 사람을 찾고싶을때, 원하는 조건을 다음과 같은 코드를 입력하면 '#결과'와 'boolean' 형태의 리스트를 반환 합니다.
df['학점'] >= 3.5
# 결과
Name
Daniel True
Jude True
Tim False
Mac False
Philip False
Jordan True
Bikram True
Nancy True
데이터 프레임은 이러한 불리언 타입 리스트를 인자로 받았을 경우 True 의 값을 가지는 row에 대해서만 데이터를 불러오게 됩니다.
# 1
df[df['학점'] >= 3.5]
# 2
condition = df['학점'] >= 3.5
df[condition]
# 3
df.loc[(df['학점'] >= 3.5)]
# 4
df.loc[condition]
조건을 전달해줄땐 위와같은 방식으로 전달이 가능합니다. 그리고 또한 '~'을 조건앞에 붙이는걸 통해 조건을 만족시키지 못하는 값들도 또한 얻어 낼 수 있습니다. 다음코드는 조건 앞에 '~'를 붙여 각 boolean 값의 반대 (부정)의 값을 가지기에 학점 3.5 미만인 학생들을 찾는 코드입니다. #3,4 는 위에서 말씀드린 loc 특성에 boolean 리스트를 인자로 준 경우 입니다.
df[~(df['학점'] >= 3.5)] # 1
df[~condtion] # 2
이러한 단일 조건, 부정 조건 이외에도 복수의 조건을 이용하여 원하는 데이터를 선별하는것 또한 가능합니다. 파이썬 기본 논리연산자인
'|' (OR) 과 '&' (AND) 를 통해서 논리연산을 거쳐서도 조건을 가져올 수 있습니다.
or_condition = (condition1) | (condition2) # 논리합
and_condition = (condtion1) & (condition2) # 논리곱
데이터 프레임에 단일조건과 동일한 방식으로 적용하여, 데이터를 불러올수 있지만, 한가지 주의해야할 점은, 조건 전체를 '(' 와 ')'로 묶는 것이 아닌 조건 문 하나하나를 소괄호로 묶어 주셔야합니다.
오늘은 판다스 라이브러리를 통해 데이터 프레임내에 원하는 데이터를 찾을 수 있는 여러가지 방법에 대해 알아 보았습니다.
'프로그래밍 > 데이터분석' 카테고리의 다른 글
[데이터분석] 판다스를 이용한 파일 입출력 (0) | 2023.04.19 |
---|---|
[데이터분석] 데이터프레임 정보 확인 (0) | 2023.04.19 |
[데이터분석]파이썬 데이터 분석 라이브러리 - 판다스 (Pandas) (0) | 2023.04.17 |