Data_Indexing_And_Selection
Data_Indexing_And_Selection
Data_Indexing_And_Selection
1
import pandas as pd
Data Selection in Series
딕셔너리 dictionary
1
2
3
4
# Series 객체는 딕셔너리와 마찬가지로 키의 집합을 값의 집합에 매핑
data = pd.Series([0.25, 0.5, 0.75, 1.0], index=['a', 'b', 'c', 'd'])
print("\ndata:\n", data)
print("\ndata['b']:", data['b'])
1
2
3
4
5
6
7
8
data:
a 0.25
b 0.50
c 0.75
d 1.00
dtype: float64
data['b']: 0.5
1
2
3
4
# 키/인덱스와 값을 조사하기 위해 딕셔너리와 유사한 파이썬 표현식과 메서드 사용
print("\n'a' in data:", 'a' in data)
print("data.keys():", data.keys())
print("list(data.items()):", list(data.items()))
1
2
3
'a' in data: True
data.keys(): Index(['a', 'b', 'c', 'd'], dtype='object')
list(data.items()): [('a', 0.25), ('b', 0.5), ('c', 0.75), ('d', 1.0)]
1
2
3
# 새로운 인덱스 값에 할당하여 Series를 확장
data['e'] = 1.25
print("\ndata:\n", data)
1
2
3
4
5
6
7
data:
a 0.25
b 0.50
c 0.75
d 1.00
e 1.25
dtype: float64
1차원 배열 one-dimensional array
1
2
# 명시적인 인덱스로 슬라이싱 --> 최종 인덱스가 슬라이스에 포함
data['a':'c']
1
2
3
4
a 0.25
b 0.50
c 0.75
dtype: float64
1
2
# 암묵적 정수 인덱스로 슬라이싱 --> 최종 인덱스가 슬라이스에서 제외
data[0:2]
1
2
3
a 0.25
b 0.50
dtype: float64
1
2
# 마스킹
data[(data > 0.3) & (data < 0.8)]
1
2
3
b 0.50
c 0.75
dtype: float64
1
2
# 팬시 인덱싱
data[['a', 'e']]
1
2
3
a 0.25
e 1.25
dtype: float64
Indexers: loc and iloc
정수 인덱스 사용 시 발생하는 혼선을 방지
loc와 iloc의 명시적 성격은 명확하고 가독성 있는 코드를 유지
1
2
3
# 명시적 정수 인덱스를 가진 Series
data = pd.Series(['a', 'b', 'c'], index=[1, 3, 5])
data
1
2
3
4
1 a
3 b
5 c
dtype: object
1
2
3
4
5
# 인덱싱할 때 명시적 인덱스 사용
print("data[1]:", data[1])
# 슬라이싱할 때 암묵적 인덱스 사용
print("data[1:3]:\n", data[1:3])
1
2
3
4
5
data[1]: a
data[1:3]:
3 b
5 c
dtype: object
1
2
3
# loc 속성은 명시적인 인덱스를 참조하는 인덱싱과 슬라이싱 가능
print("data.loc[1]:", data.loc[1])
print("data.loc[1:3]:\n", data.loc[1:3])
1
2
3
4
5
data.loc[1]: a
data.loc[1:3]:
1 a
3 b
dtype: object
1
2
3
# iloc 속성은 인덱싱과 슬라이싱에서 암묵적인 파이썬 스타일의 인덱스를 참조
print("data.iloc[1]:", data.iloc[1])
print("data.iloc[1:3]:\n", data.iloc[1:3])
1
2
3
4
5
data.iloc[1]: b
data.iloc[1:3]:
3 b
5 c
dtype: object
DataFrame에서 데이터 선택
딕셔너리 dictionary
1
2
3
4
5
6
7
8
area = pd.Series({'California': 423967, 'Texas': 695662,
'New York': 141297, 'Florida': 170312,
'Illinois': 149995})
pop = pd.Series({'California': 38332521, 'Texas': 26448193,
'New York': 19651127, 'Florida': 19552860,
'Illinois': 12882135})
data = pd.DataFrame({'area': area, 'pop': pop})
data
| area | pop | |
|---|---|---|
| California | 423967 | 38332521 |
| Texas | 695662 | 26448193 |
| New York | 141297 | 19651127 |
| Florida | 170312 | 19552860 |
| Illinois | 149995 | 12882135 |
1
2
# DataFrame의 열을 이루는 각 Series는 열 이름으로 된 딕셔너리 스타일의 인덱싱을 통해 접근 가능
data['area']
1
2
3
4
5
6
California 423967
Texas 695662
New York 141297
Florida 170312
Illinois 149995
Name: area, dtype: int64
1
2
# 문자열인 열(column)이름을 이용해 속성 스타일로 접근 가능
data.area
1
2
3
4
5
6
California 423967
Texas 695662
New York 141297
Florida 170312
Illinois 149995
Name: area, dtype: int64
1
2
3
# 열 이름이 문자열이 아니거나 메서드와 충돌할 때 이 속성 스타일로 접근 불가
# data.pop --> pop() 메서드를 가리킴
data.pop is data['pop']
1
False
1
2
3
# 열을 할당 시 data['pop'] = z 를 사용 --> data.pop = z 금지
data['density'] = data['pop'] / data['area']
data
| area | pop | density | |
|---|---|---|---|
| California | 423967 | 38332521 | 90.413926 |
| Texas | 695662 | 26448193 | 38.018740 |
| New York | 141297 | 19651127 | 139.076746 |
| Florida | 170312 | 19552860 | 114.806121 |
| Illinois | 149995 | 12882135 | 85.883763 |
2차원 배열 two-dimensional array
1
2
# values 속성을 이용해 원시 기반 데이터 배열 확인
data.values
1
2
3
4
5
array([[4.23967000e+05, 3.83325210e+07, 9.04139261e+01],
[6.95662000e+05, 2.64481930e+07, 3.80187404e+01],
[1.41297000e+05, 1.96511270e+07, 1.39076746e+02],
[1.70312000e+05, 1.95528600e+07, 1.14806121e+02],
[1.49995000e+05, 1.28821350e+07, 8.58837628e+01]])
1
data.T
| California | Texas | New York | Florida | Illinois | |
|---|---|---|---|---|---|
| area | 4.239670e+05 | 6.956620e+05 | 1.412970e+05 | 1.703120e+05 | 1.499950e+05 |
| pop | 3.833252e+07 | 2.644819e+07 | 1.965113e+07 | 1.955286e+07 | 1.288214e+07 |
| density | 9.041393e+01 | 3.801874e+01 | 1.390767e+02 | 1.148061e+02 | 8.588376e+01 |
1
2
# 배열에 단일 인덱스를 전달 시 행에 접근
data.values[0]
1
array([4.23967000e+05, 3.83325210e+07, 9.04139261e+01])
1
2
# DataFrame에 단일 인덱스를 전달 시 열에 접근
data['area']
1
2
3
4
5
6
California 423967
Texas 695662
New York 141297
Florida 170312
Illinois 149995
Name: area, dtype: int64
1
2
# iloc 인덱서를 사용해 DataFrame객체를 단순 NumPy배열처럼 기반 배열 인덱싱
data.iloc[:3, :2]
| area | pop | |
|---|---|---|
| California | 423967 | 38332521 |
| Texas | 695662 | 26448193 |
| New York | 141297 | 19651127 |
1
2
# loc 인덱서를 사용해 배열과 같은 스타일로 기초 데이터 인덱싱
data.loc[:'Florida', :'pop']
| area | pop | |
|---|---|---|
| California | 423967 | 38332521 |
| Texas | 695662 | 26448193 |
| New York | 141297 | 19651127 |
| Florida | 170312 | 19552860 |
1
2
# 마스킹과 팬시 인덱싱 결합
data.loc[data.density > 100, ['pop', 'density']]
| pop | density | |
|---|---|---|
| New York | 19651127 | 139.076746 |
| Florida | 19552860 | 114.806121 |
1
2
3
# 값을 설정하거나 변경하는 데 사용
data.iloc[0, 2] = 90
data
| area | pop | density | |
|---|---|---|---|
| California | 423967 | 38332521 | 90.000000 |
| Texas | 695662 | 26448193 | 38.018740 |
| New York | 141297 | 19651127 | 139.076746 |
| Florida | 170312 | 19552860 | 114.806121 |
| Illinois | 149995 | 12882135 | 85.883763 |
추가적인 인덱싱 규칙 Additional indexing conventions
1
2
# 인덱싱은 열을 참조, 슬라이싱은 행을 참조
data['Florida':'Illinois']
| area | pop | density | |
|---|---|---|---|
| Florida | 170312 | 19552860 | 114.806121 |
| Illinois | 149995 | 12882135 | 85.883763 |
1
2
# 슬라이스를 인덱스 대신 숫자로 행을 참조
data[1:3]
| area | pop | density | |
|---|---|---|---|
| Texas | 695662 | 26448193 | 38.018740 |
| New York | 141297 | 19651127 | 139.076746 |
1
2
# 직접 마스킹 연산은 열 단위가 아닌 행 단위로 해석
data[data.density > 100]
| area | pop | density | |
|---|---|---|---|
| New York | 141297 | 19651127 | 139.076746 |
| Florida | 170312 | 19552860 | 114.806121 |
이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.