티스토리 뷰

#5 판다스 chapter 5. 판다스 시리즈 응용하기

 

1. 시리즈와 불린 추출

 

원하는 데이터를 추출할 때 특정 인덱스를 지정하여 추출했었다. 하지만 보통은 추출할 데이터의 정확한 인덱스를 모를 경우가 더 많다. 이때 사용하는 방법이 불린 추출이다. 불린 추출은 특정 조건을 만족하는 값만 추출할 수 있다.

 

이번에는 scientist.csv 라는 이름의 데이터를 불러오자.

 

(데이터 출처 : github.com/easysIT/doit_pandas)

 

scientists = pd.read_csv('../data/scientists.csv')

ages = scientists['Age']
print(ages.max())

90

print(ages.mean())

59.125

print(ages[ages > ages.mean()])

1    61
2    90
3    66
7    77
Name: Age, dtype: int64

 

위 예에서 마지막 코드는 평균 나이보다 나이가 많은 사람의 데이터만 출력되었다. 이는 아래의 결과를 보면 조건식을 만족한 값만 출력했다는 의미다.

 

print(ages > ages.mean() )

0    False
1     True
2     True
3     True
4    False
5    False
6    False
7     True
Name: Age, dtype: bool

 

2. 시리즈와 브로드캐스팅

 

앞서 보았던 ages > ages.mean()의 결괏값의 개수가 여러 개라는 것이 이상했을 것이다. 이렇게 시리즈나 데이터프레임에 있는 모든 데이터에 대해 한 번에 연산하는 것을 브로드캐스팅이라고 한다. 그리고 시리즈처럼 여러 개의 값을 가진 데이터를 벡터라 하고 단순 크기를 나타내는 데이터를 스칼라라고 한다.

 

다음은 같은 길이의 벡터로 더하기 연산과 곱하기 연산을 수행한 것이다.

 

print(ages + ages)

0     74
1    122
2    180
3    132
4    112
5     90
6     82
7    154
Name: Age, dtype: int64

print(ages * ages)

0    1369
1    3721
2    8100
3    4356
4    3136
5    2025
6    1681
7    5929
Name: Age, dtype: int64

 

만약 벡터에 스칼라를 연산하면 어떻게 될까? 

 

print(ages + 100)

0    137
1    161
2    190
3    166
4    156
5    145
6    141
7    177
Name: Age, dtype: int64

print(ages * 2)

0     74
1    122
2    180
3    132
4    112
5     90
6     82
7    154
Name: Age, dtype: int64

 

또 길이가 서로 다른 벡터를 연산하면 어떻게 될까? 시리즈와 시리즈를 연산하는 경우 같은 인덱스의 값만 계산한다.

 

print(pd.Series([1, 100]))

0      1
1    100
dtype: int64

print(ages + pd.Series([1, 100]))

0     38.0
1    161.0
2      NaN
3      NaN
4      NaN
5      NaN
6      NaN
7      NaN
dtype: float64

 

위 결과처럼 인덱스가 일치한 0,1 만 계산했다는 것을 알 수 있다. 나머지 인덱스는 계산을 할 수 없기 때문에 NaN으로 처리된다.

 

 

다음은 sort_index 메서드를 사용한 것이다. 이때 ascending 인자로 False를 전달하여 인덱스 역순으로 데이터를 정렬했다.

 

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를 연산하면 어떻게 될까요? 

print(ages * 2)


0     74
1    122
2    180
3    132
4    112
5     90
6     82
7    154
Name: Age, dtype: int64

print(ages + rev_ages)

0     74
1    122
2    180
3    132
4    112
5     90
6     82
7    154
Name: Age, dtype: int64

 

위처럼 벡터와 벡터의 연산은 일치하는 인덱스의 값끼리 수행한다는 것을 잊지 말아야 한다.

 

출처 : 데이터 분석을 위한 판다스 입문

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함