포스트

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
areapop
California42396738332521
Texas69566226448193
New York14129719651127
Florida17031219552860
Illinois14999512882135
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
areapopdensity
California4239673833252190.413926
Texas6956622644819338.018740
New York14129719651127139.076746
Florida17031219552860114.806121
Illinois1499951288213585.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
CaliforniaTexasNew YorkFloridaIllinois
area4.239670e+056.956620e+051.412970e+051.703120e+051.499950e+05
pop3.833252e+072.644819e+071.965113e+071.955286e+071.288214e+07
density9.041393e+013.801874e+011.390767e+021.148061e+028.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]
areapop
California42396738332521
Texas69566226448193
New York14129719651127
1
2
# loc 인덱서를 사용해 배열과 같은 스타일로 기초 데이터 인덱싱
data.loc[:'Florida', :'pop']
areapop
California42396738332521
Texas69566226448193
New York14129719651127
Florida17031219552860
1
2
# 마스킹과 팬시 인덱싱 결합
data.loc[data.density > 100, ['pop', 'density']]
popdensity
New York19651127139.076746
Florida19552860114.806121
1
2
3
# 값을 설정하거나 변경하는 데 사용
data.iloc[0, 2] = 90
data
areapopdensity
California4239673833252190.000000
Texas6956622644819338.018740
New York14129719651127139.076746
Florida17031219552860114.806121
Illinois1499951288213585.883763

추가적인 인덱싱 규칙 Additional indexing conventions

1
2
# 인덱싱은 열을 참조, 슬라이싱은 행을 참조
data['Florida':'Illinois']
areapopdensity
Florida17031219552860114.806121
Illinois1499951288213585.883763
1
2
# 슬라이스를 인덱스 대신 숫자로 행을 참조
data[1:3]
areapopdensity
Texas6956622644819338.018740
New York14129719651127139.076746
1
2
# 직접 마스킹 연산은 열 단위가 아닌 행 단위로 해석
data[data.density > 100]
areapopdensity
New York14129719651127139.076746
Florida17031219552860114.806121
이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.