-
Chapter 03-1~03-3 나만의 데이터 만들기, 시리즈 다루기(기초,응용)Do it! 판다스 입문 2022. 6. 13. 19:58
나만의 데이터 만들기
02장에서는 파일에서 데이터 집합을 불러온 다음 실습을 진행했습니다. 이번에는 실습에 사용할 시리즈와 데이터프레임을 직접 만들어서 진행하겠습니다.
시리즈와 데이터프레임 직접 만들기
1. 시리즈 만들기
판다스의 Series 메서드에 리스트를 전달하여 시리즈를 생성합니다.
import pandas as pd
s = pd.Series(['banana', 42]
print(s)
0 banana
1 42
dtype: object2. 02장에서 인덱스는 보통 0부터 시작한다고 설명했던 것을 기억하나요? 하지만 시리즈를 생성할 때 문자열을 인덱스로 지정할 수도 있습니다. 문자열을 인덱스로 지정하려면 Series 메서드의 index 인자를 통해 인덱스로 사용하고자 하는 문자열을 리스트에 담아 전달하면 됩니다.
s = pd.Series(['Wes McKinney', 'Creator of pandas'])
print(s)
0 Wes McKinney
1 Creator of pandas
dtype: object
s = pd.Series(['Wes McKinney', 'Creator of pandas'], index=['Person', 'Who'])
print(s)
Person Wes McKinney
Who Creator of pandas
dtype: object3. 데이터프레임 만들기
데이터프레임을 만들기 위해서는 딕셔너리를 DataFrame 클래스에 전달해야 합니다.
scientists = pd.DataFrame({
'Name':['Rosaline Franklin', 'William Gosset'],
'Occupation':['Chemist', 'Statistician'],
'Born':['1920-07-25', '1876-06-13'],
'Died':['1958-04-16', '1937-10-16'],
'Age':['37', '61']}
)
print(scientists)
Name Occupation Born Died Age
0 Rosaline Franklin Chemist 1920-07-25 1958-04-16 37
1 William Gosset Statistician 1876-06-13 1937-10-16 614. 시리즈와 마찬가지로 데이터프레임도 인덱스를 따로 지정하지 않으면 인덱스를 0부터 자동으로 생성합니다. 인덱스를 따로 지정하려면 index 인자에 리스트를 전달하면 됩니다. 또 columns 인자를 사용하면 데이터프레임의 열 순서를 지정할 수 있습니다. 예를 들어 데이터프레임을 만들 때 Occupation, Born, Died, Age의 순서로 딕셔너리를 전달했어도 columns 인자에 Occupation, Born, Died, Age의 순서로 열 이름을 전달하면 생성된 데이터프레임의 열 순서는 columns에 전달한 값을 따라갑니다.
scientists = pd.DataFrame(
data={'Occupation':['Chemist', 'statistician'],
'Born':['1920-07-25', '1876-06-13'],
'Died':['1958-04-16', '1937-10-16'],
'Age':[37, 61]},
index = ['Rosaline Franklin', 'William Fosset'],
columns = ['Occupation', 'Born', 'Age', 'Died'])
print(scientists)
Occupation Born Age Died
Rosaline Franklin Chemist 1920-07-25 37 1958-04-16
William Gosset Statistician 1876-06-13 61 1937-10-165. 과정 1에서 데이터프레임을 만들 때 딕셔너리를 전달한다고 했습니다. 그런데 딕셔너리는 키(Key)와 값(Value)으로 이루어진 한 쌍의 데이터들의 순서는 보장하지 않습니다. 만약 순서가 보장된 딕셔너리를 전달하려면 OrderedDict를 사용해야 합니다. 다음과 같이 입력하면 딕셔너리의 데이터 순서를 그대로 유지하면서 데이터프레임을 만들 수 있습니다.
from collections import OrderedDict
scientists = pd.DataFrame(OrderedDict([
('Name', ['Rosaline Franklin', 'William Gosset']),
('Pccupation', ['Chemist', 'Statistician']),
('Born', ['1920-07-25', '1876-06-13']),
('Died', ['1958-04-16', '1937-10-16']),
('Age', [37, 61])
]))
print(scientists)
Name Occupation Born Died Age
0 Rosaline Franklin Chemist 1920-07-25 1958-04-16 37
1 William Gosset Statistician 1876-06-13 1937-10-16 61시리즈 다루기 - 기초
판다스의 데이터를 구성하는 가장 기본 단위는 시리즈입니다. 이번에는 데이터프레임에서 시리즈를 선택하는 방법에 대해 알아보겠습니다.
데이터프레임에서 시리즈 선택하기
1. 먼저 변수 scientists에 데이터프레임을 준비합니다.
scientists = pd.DataFrame(
data={'Occupation':['Chemist', 'statistician'],
'Born':['1920-07-25', '1876-06-13'],
'Died':['1958-04-16', '1937-10-16'],
'Age':[37, 61]},
index = ['Rosaline Franklin', 'William Gosset'],
columns = ['Occupation', 'Born', 'Age', 'Died'])2. 데이터프레임에서 시리즈를 선택하려면 loc 속성에 인덱스(과학자 이름)를 전달하면 됩니다. 정말 시리즈를 선택한 것인지 확인하기 위해 type으로 한 번 더 검사합니다.
first_row = scientists.loc['William Gosset']
print(type(first_row))
<class 'pandas.core.series.Series'>3. first_row를 출력해 보겠습니다. 여기서 주목해야 할 점은 데이터프레임을 만들 때 Age열에 정수형 리스트를 전달해도 시리즈(first_row)를 출력해 보면 시리즈의 자료형을 오브젝트로 인식한다는 점입니다.
print(first_row)
Occupation Statistician
Born 1876-06-13
Died 1937-10-16
Age 61
Name: William Gosset, dtype: object시리즈 속성과 메서드 사용하기 - index, values, keys
01장에서 실습한 loc, iloc와 같은 속성 외에도 시리즈에는 다양한 속성이 미리 정의되어 있습니다. 이번에는 index, values 속성과 keys 메서드에 대해 알아보겠습니다.
index, values 속성과 keys 메서드 사용하기
1. index 속성 사용하기
먼저 index 속성을 사용해 보겠습니다. index 속성에는 시리즈의 인덱스가 들어있습니다.
print(first_row.index)
Index(['Occupation', 'Born', 'Died', 'Age'], dtype='object')2. values 속성 사용하기
values 속성에는 시리즈의 데이터가 저장되어 있습니다.
print(first_row.values)
['Statistician' '1876-06-13' '1937-10-16' 61]3. keys 메서드 사용하기
keys는 속성이 아니라 메서드입니다. keys 메서드의 기능은 무엇일까요? keys 메서드는 index 속성과 같은 역할을 합니다. 즉, 과정 1의 결과와 동일한 결괏값을 얻을 수 있습니다.
print(first_row.keys( ))
Index(['Occupation', 'Born', 'Died', 'Age'], dtype='object')4. index 속성 응용하기
만약 index 속성의 첫 번째 값을 추출하려면 다음과 같이 코드를 작성하면 됩니다.
print(first_row.index[0])
Occupation5. keys 메서드 응용하기
keys 메서드의 결괏값을 이용하여 인덱스의 첫 번째 값을 추출하는 방법은 다음과 같습니다.
print(first_row.keys( )[0])
Occupation시리즈의 기초 통계 메서드 사용하기
시리즈에는 keys 메서드 외에도 다양한 메서드가 있습니다. 이번에는 시리즈에 미리 정의되어 있는 mean, min, max, std 메서드의 사용 방법을 알아보겠습니다.
시리즈의 mean, min, max, std 메서드 사용하기
1. 이번에는 scientists의 Age 열을 추출해 보겠습니다.
ages=scientists['Age']
print(ages)
Rosaline Franklin 37
William Gosset 61
Name: age, dtype: int642. 만약 시리즈를 구성하는 데이터가 정수라면 mean, min, max, std와 같은 통계 메서드를 사용할 수 있습니다.
print(ages.mean( ))
49.0
print(ages.min( ))
37
print(ages.max( ))
61
print(ages.std( ))
16
97056274847714다음은 시리즈에서 자주 사용하는 메서드를 정리한 표입니다. 앞으로 종종 사용할 메서드이므로 한 번 읽어보고 넘어가기 바랍니다.
시리즈 메서드 정리
시리즈 메서드 설명 append 2개 이상의 시리즈 연결 describe 요약 통계량 계산 drop_duplicates 중복값이 없는 시리즈 반환 equals 시리즈에 해당 값을 가진 요소가 있는지 확인 get_values 시리즈 값 구하기(values 속성과 동일) isin 시리즈에 포함된 값이 있는지 확인 min 최솟값 반환 max 최댓값 반환 mean 산술 평균 반환 median 중간값 반환 replace 특정 값을 가진 시리즈 값을 교체 sample 시리즈에서 임의의 값을 반환 sort_values 값을 정렬 to_frame 시리즈를 데이터프레임으로 변환 시리즈 다루기 - 응용
시리즈와 불린 추출
02장에서는 원하는 데이터를 추출할 때 특정 인덱스를 지정하여 추출했습니다. 하지만 보통은 추출할 데이터의 정확한 인덱스를 모르는 경우가 더 많죠. 이런 경우에 사용하는 방법이 불린 추출입니다. 불린 추출은 특정 조건을 만족하는 값만 추출할 수 있습니다.
시리즈와 불린 추출 사용하기
1. 이번에는 'scientists.csv'라는 이름의 데이터를 불러옵니다.
scientists=pd.read_csv('../data/scientists.csv') 2. 앞에서 시리즈의 mean, min, max, std 메서드를 호출하여 통계 수치를 계산했던 것을 기억하나요? 통계 수치의 결괏값을 이용하여 불린 추출을 진행해 보겠습니다. 다음은 Age열을 추출하여 max, mean 메서드를 사용한 것입니다.
ages=scientists['Age']
print(ages.max())
90
print(ages.mean())
59.1253. 이제 불린 추출을 사용할 차례입니다. 예를 들어 평균 나이보다 나이가 많은 사람의 데이터를 추출하려면 어떻게 해야 할까요? 다음 코드를 실행하면 평균 나이보다 나이가 많은 사람의 데이터만 출력됩니다.
print(ages[ages > ages.mean()])
0 61
2 90
3 66
7 77
Name: Age, dtype: int644. 그런데 어떻게 이런일이 가능할까요? 먼저 ages > ages.mean( )의 결과를 출력해 보겠습니다. 그러면 1, 2, 3, 7 인덱스의 데이터가 참(True)이라는 것을 알 수 있습니다. 즉, 조건식을 만족한 값만 출력된 것이죠.
print(ages > ages.mean())
0 False
1 True
2 True
3 True
4 False
5 False
6 False
7 True
Name: Age, dtype: bool
print(type(ages > ages.mean( )))
<class 'pandas.core.series.series'="">5. 과정 3과 4를 모두 합친 코드는 다음과 같습니다. 즉, 리스트 형태로 참이나 거짓을 담아 시리즈에 전달하면 참인 인덱스의 데이터만 추출할 수 있습니다. 바로 이것을 불린 추출이라고 합니다.
manual_bool_values = [True, True, False, False, True, True, False, True]
print(ages[manual_bool_values])
0 37
1 61
4 56
5 45
7 77
Name: Age, dtype: int64시리즈와 브로드캐스팅
그런데 ages > ages.mean( )의 결괏값의 개수가 여러 개라는 것이 이상하지 않았나요? 이렇게 시리즈나 데이터프레임에 있는 모든 데이터에 대해 한 번에 연산하는 것을 브로드캐스팅(Breadcasting)이라고 합니다. 그리고 시리즈처럼 여러 개의 값을 가진 데이터를 벡터라하고 단순 크기를 나타내는 데이터를 스칼라라고 합니다. 앞으로 벡터와 스칼라라는 용어는 자주 사용하므로 기억해 두기 바랍니다.
벡터와 스칼라로 브로드캐스팅 수행하기
1. 다음은 같은 길이의 벡터로 더하기 연산과 곱하기 연산을 수행한 것입니다. 결괏값으로 같은 길이의 벡터가 출력됩니다.
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: int642. 만약 벡터에 스칼라를 연산하면 어떻게 될까요? 다음은 벡터의 모든 값에 스칼라를 적용하여 브로드캐스팅한 결과입니다.
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: int643. 길이가 서로 다른 벡터를 연산하면 어떻게 될까요? 시리즈와 시리즈를 연산하는 경우 같은 인덱스의 값만 계산합니다. 다음은 데이터의 개수가 2개인 시리즈와 8개인 시리즈를 더한 것입니다. 결괏값을 살펴보면 인덱스가 일치한 0, 1만 계산했다는 것을 알 수 있습니다. 나머지 인덱스(2~7)는 계산을 할 수 없기 때문에 누락값(NaN)으로 처리합니다.
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: float644. 다음은 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: int645. 그러면 인덱스 순서대로 정렬된 ages와 인덱스의 역순으로 정렬된 rev_age를 연산하면 어떻게 될까요? ages의 데이터와 rev_ages의 데이터를 순서대로 더할 것 같지만 그렇지 않습니다. 다음은 ages * 2와 ages + rev_ages의 결괏값을 출력한 것입니다. 어떤가요? ages * 2와 ages + rev_ages의 결괏값이 동일합니다. ages의 인덱스(0~7)와 rev_ages의 인덱스(0~7)가 일치하는 값끼리 연산했기 때문이죠. 벡터와 벡터의 연산은 일치하는 인덱스의 값끼리 수행한다는 것을 잊지 마세요.
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출처 : "판다스 입문"
'Do it! 판다스 입문' 카테고리의 다른 글
Chapter 04-1 데이터 시각화가 필요한 이유 (0) 2022.06.20 Chapter 03-4~03-6 데이터프레임 다루기, 시리즈와 데이터프레임의 데이터 처리하기, 데이터 저장하고 불러오기 (0) 2022.06.13 Chapter.02-3~02-4 기초적인 통계 계산하기, 그래프 그리기 (0) 2022.06.12 Chapter.02-2 데이터 추출하기 (0) 2022.06.12 Chapter 02-1 데이터 집합 불러오기 (0) 2022.06.11