[데이터분석] 데이터프레임 활용 - 데이터 선택

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

 

왼쪽 : #1 오른쪽 : #2

 

두 코드 모두 판다스가 자동으로 0번부터 인덱스를 다시 설정해주지만,  drop 속성을 True로 지정해준다면, 기존에 사용하던 인덱스 컬럼을 삭제합니다.

 

하지만 인덱스 리셋시 주의사항이 있습니다. #1, #2 코드를 실행시키면 위 사진처럼 결과물을 출력하나, 다시 데이터프레임 원본 "df"를 출력하게된다면, 아래와 같은 결과물을 반환합니다.

reset_index() 가 실제 데이터 프레임에 적용되지 않음.

실제 데이터프레임에는 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 반환

왼쪽 : #1 오른쪽 : #2

2차원 리스트와 한가지 다른점은, 이차원 리스트에서 #1 번처럼 접근했다면, 0번 컬럼부터 2번컬럼까지의 데이터가 나와야 하는 것이라고 생각 하실 수도 있지만, 2차원리스트와는 살짝 다르게 동작합니다.

 

d. loc를 통한 데이터 선택

이부분 부터는 살짝 복잡하게 느껴질 수 있습니다.

'loc' 는 데이터프레임의 속성중 하나로, 인덱스 값으로 해당하는 데이터를 찾게 도와줍니다. 인덱스 값이외에도 boolean 리스트 또한 인자로 받을 수 있으나 차후에 소개해 드리겠습니다.

지금 부터는 'Name' 컬럼을 인덱스로 지정한 데이터 프레임을 사용하겠습니다.

Name이 Index인 데이터 프레임

# 기본형 : 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]

#1, #2, #3, #4

조건을 전달해줄땐  위와같은 방식으로 전달이 가능합니다.  그리고 또한 '~'을 조건앞에 붙이는걸 통해 조건을 만족시키지 못하는 값들도 또한 얻어 낼 수 있습니다. 다음코드는 조건 앞에 '~'를 붙여 각 boolean 값의 반대 (부정)의 값을 가지기에 학점 3.5 미만인 학생들을 찾는 코드입니다. #3,4 는 위에서 말씀드린 loc 특성에 boolean 리스트를 인자로 준 경우 입니다.

df[~(df['학점'] >= 3.5)] # 1
df[~condtion] # 2

#1, #2

이러한 단일 조건, 부정 조건 이외에도 복수의 조건을 이용하여 원하는 데이터를 선별하는것 또한 가능합니다. 파이썬 기본 논리연산자인

'|' (OR) 과 '&' (AND) 를 통해서 논리연산을 거쳐서도 조건을 가져올 수 있습니다.

or_condition = (condition1) | (condition2) # 논리합

and_condition = (condtion1) & (condition2) # 논리곱

데이터 프레임에 단일조건과 동일한 방식으로 적용하여, 데이터를 불러올수 있지만, 한가지 주의해야할 점은, 조건 전체를 '(' 와 ')'로 묶는 것이 아닌 조건 문 하나하나를 소괄호로 묶어 주셔야합니다.

 

오늘은 판다스 라이브러리를 통해 데이터 프레임내에 원하는 데이터를 찾을 수 있는 여러가지 방법에 대해 알아 보았습니다.

반응형