03-3
시리즈 다루기 - 응용¶
시리즈와 불린 추출
02장에서는 원하는 데이터를 추출할 때 특정 인덱스를 지정하여 추출했다. 하지만 보통은 추출한 데이터의 정확한 인덱스를 모르는 경우가 더 많다. 이런 경우에 사용하는 방법이 불린 추출이다. 불린 추출은 특정 조건에 만족하는 값만 추출할 수 있다.
시리즈와 불린 추출 사용하기¶
- 이번에는 'scientists.csv'라는 이름의 데이터를 불러온다.
In [44]:
import pandas as pd
scientists = pd.read_csv('doit_pandas_data/data/scientists.csv')
- 통계 수치의 결괏값을 이용하여 불린 추출을 진행해 보겠다. 다음은 Age 열을 추출하여 max, mean 메서드를 사용한 것이다.
In [45]:
ages = scientists['Age']
print(ages.max())
90
In [46]:
print(ages.mean())
59.125
- 이제 불린 추출을 사용할 차례이다. 예를 들어 평균 나이보다 나이가 많은 사람의 데이터를 추출하려면 어떻게 해야 할까? 다음 코드를 실행하면 평균 나이보다 나이가 많은 사람의 데이터만 출력된다.
In [47]:
print(ages[ages > ages.mean()])
1 61 2 90 3 66 7 77 Name: Age, dtype: int64
- 그런데 어떻게 이런 일이 가능할까? 먼저 ages > ages.mean()의 결과를 출력해 보겠다. 그러면 1, 2, 3, 7 인덱스의 데이터가 참(True)이라는 것을 알 수 있다. 즉, 조건식을 만족한 값만 출력된 것이다.
In [48]:
print(ages > ages.mean())
0 False 1 True 2 True 3 True 4 False 5 False 6 False 7 True Name: Age, dtype: bool
- 과정 3과 4를 모두 합친 코드는 다음과 같다. 즉, 리스트 형태로 참이나 거짓을 담아 시리즈에 전달하면 참인 인덱스의 데이터만 추출할 수 있다. 바로 이것을 불린 추출이라고 한다.
In [49]:
manual_bool_values = [True, True, False, False, True, True, False, True]
시리즈와 브로드캐스팅
그런데 ages > ages.mean()의 결괏값에 개수가 여러 개라는 것이 이상하지 않았나? 이렇게 시리즈나 데이터프레임에 있는 모든 데이터에 대해 한 번에 연산하는 것을 브로드캐스팅(Broadcasting)이라고 합니다. 그리고 시리즈처럼 여러 개의 값을 가진 데이터를 벡터라 하고 단순 크기를 나타내는 데이터를 스칼라라고 한다. 앞으로 벡터와 스칼라라는 용어는 자주 사용하므로 기억해 두기 바란다.
벡터와 스칼라로 브로드캐스팅 수행하기¶
- 다음은 같은 길이의 벡터로 더하기 연산과 곱하기 연산을 수행한 것이다. 결괏값으로 같은 길이의 벡터가 출력된다.
In [50]:
print(ages + ages)
0 74 1 122 2 180 3 132 4 112 5 90 6 82 7 154 Name: Age, dtype: int64
In [51]:
print(ages * ages)
0 1369 1 3721 2 8100 3 4356 4 3136 5 2025 6 1681 7 5929 Name: Age, dtype: int64
- 만약 벡터에 스칼라를 연산하면 어떻게 될까? 다음은 벡터의 모든 값에 스칼라를 적용하여 브로드캐스팅한 결과이다.
In [52]:
print(ages + 100)
0 137 1 161 2 190 3 166 4 156 5 145 6 141 7 177 Name: Age, dtype: int64
In [53]:
print(ages * 2)
0 74 1 122 2 180 3 132 4 112 5 90 6 82 7 154 Name: Age, dtype: int64
길이가 서로 다른 벡터를 연산하면 어떻게 될까? 시리즈와 시리즈를 연산하는 경우 같은 인덱스의 값만 계산한다. 다음은 데이터의 개수가 2개이니 시리즈와 8개인 시리즈를 더한것이다. 결괏값을 살펴보면 인덱스가 일치한 0, 1만 계산했다는 것을 알 수 있다. 나머지 인덱스(2~7)는 계산할 수 없기 때문에 누락값(NaN)으로 처리한다
In [54]:
print(pd.Series([1, 100, 1000]))
0 1 1 100 2 1000 dtype: int64
In [55]:
print(ages + pd.Series([1, 10]))
0 38.0 1 71.0 2 NaN 3 NaN 4 NaN 5 NaN 6 NaN 7 NaN dtype: float64
- 다음은 sort_index 메서드를 사용한 것이다. 이때 ascending 인자로 False를 전달하여 인덱스 역순으로 데이터를 정렬했다.
(데이터의 역순이 아니다.)
In [56]:
rev_ages = ages.sort_index(ascending=False)
print(rev_ages)
7 77 6 41 5 45 4 56 3 66 2 90 1 61 0 37 Name: Age, dtype: int64
- 인덱스 순서대로 정렬된 ages와 인덱스의 역순으로 정렬된 rev_age를 연산하면 어떻게 될까? ages의 데이터와 데이터를 순서대로 더할 것 같지만 그렇지 않다. 다음은 ages 2와 ages + rev_ages의 결과값을 출력한 것이다. ages 2와 ages + rev_ages의 결괏값이 동일하다. ages의 인덱스(0:7)와 rev_ages의 인덱스(0:7)가 일치하는 값끼리 연산했기 떄문이다. 벡터와 벡터의 연산은 일치하는 인덱스의 값끼리 수행한다는 것을 잊지 말아야 한다.
In [57]:
print(ages * 2)
0 74 1 122 2 180 3 132 4 112 5 90 6 82 7 154 Name: Age, dtype: int64
In [58]:
print(ages + rev_ages)
0 74 1 122 2 180 3 132 4 112 5 90 6 82 7 154 Name: Age, dtype: int64
출처 : Do it! 데이터 분석을 위한 판다스
'Python > Pandas' 카테고리의 다른 글
<파이썬 판다스> Chapter 03-5 시리즈와 데이터프레임의 데이터 처리하기 (0) | 2023.04.28 |
---|---|
<파이썬 판다스> Chapter 03-4 데이터프레임 다루기 (0) | 2023.04.28 |
<파이썬 판다스> Chapter 03-2 시리즈 다루기 - 기초 (0) | 2023.04.28 |
<파이썬 판다스> Chapter 03-1 나만의 데이터 만들기 (0) | 2023.04.28 |
<파이썬 판다스> Chapter 02-4 그래프 그리기 (0) | 2023.04.26 |