Comment :
Python - Pandas의 DataFrame은 행(Row)과 열(Column)으로 이루어진 데이터 구조이며 DataFrame에서 필요한 데이터만 뽑아내는 작업을 인덱싱(Indexing)이라고 한다.
아래와 같은 3가지 종류의 인덱싱 방법이 있으며 예시들을 통해서 각 인덱싱 방법을 알아보자
- Direct Indexing :
df[]- loc :
df.loc[]- iloc :
df.iloc[][+] 슬라이싱(Slicing) : 시퀀스 데이터, 즉 리스트, 문자열, 튜플같은 데이터 타입에서 특정부분을 추출하는 방법. 기본문법은 다음과 같음
seq[시작 : 끝 : 간격]
먼저 DataFrame Indexing 예시에 사용할 샘플 DataFrame(liverpool)을 만들어보자
column1 = ['Salah', 'Diaz', 'Jota', 'Nunez', 'MacAllister' ]
column2 = np.random.randint(80,90,size=(5))
column3 = np.random.randint(80,90,size=(5))
column4 = np.random.randint(80,90,size=(5))
column5 = np.random.randint(80,90,size=(5))
dict_l = {'Name' : column1,
'Attack' : column2,
'Pass' : column3,
'Speed' : column4,
'Balance' : column5}
liverpool = pd.DataFrame(dict_l)
| Name | Attack | Pass | Speed | Balance | |
|---|---|---|---|---|---|
| 0 | Salah | 89 | 81 | 81 | 88 |
| 1 | Diaz | 85 | 85 | 88 | 83 |
| 2 | Jota | 81 | 87 | 86 | 89 |
| 3 | Nunez | 85 | 84 | 87 | 84 |
| 4 | MacAllister | 84 | 82 | 81 | 86 |
(맞는 용어는 아니지만 df[]과 같이 바로 인덱싱을 하여 Direct Indexing이라고 칭한다, 많이 사용하지 않을것같은 방법)
print( liverpool['Attack'] )
print( liverpool[['Pass', 'Balance']] ) # 리스트 삽입 시 column 인덱싱
print( liverpool[ 0:2 ]) # 리스트 슬라이싱 삽입 시 row로 인덱싱
>>>
0 89
1 85
2 81
3 85
4 84
Name: Attack, dtype: int32
Pass Balance
0 81 88
1 85 83
2 87 89
3 84 84
4 82 86
Name Attack Pass Speed Balance
0 Salah 89 81 81 88
1 Diaz 85 85 88 83
df.loc["row", "column"] 으로 생각하면 되며,
각 요소자리("row", "column")에는 row, column의 이름을 넣으면 된다.
이름을 넣는 방법은 이름, 리스트, 슬라이싱이 가능하다.
| Name | Attack | Pass | Speed | Balance | |
|---|---|---|---|---|---|
| 0 | Salah | 89 | 81 | 81 | 88 |
| 1 | Diaz | 85 | 85 | 88 | 83 |
| 2 | Jota | 81 | 87 | 86 | 89 |
| 3 | Nunez | 85 | 84 | 87 | 84 |
| 4 | MacAllister | 84 | 82 | 81 | 86 |
위와 같은 DataFrame에서는 row의 이름은 0,1,2,3,4이고, column의 이름은 "Name",... "Balance"이다.
✅ row, column 각 1개에만 접근
# 3번째 선수의 "Speed"를 확인해보자
liverpool.loc[3, "Speed"]
>>>
np.int32(87)
✅ 원하는 row, column에 접근 (원하는 row, column 다수개에 접근할 수 있으나, 일일히 이름을 리스트로 명시해줘야 함)
# 1,3,4번째 선수의 '이름'과 'Speed'를 확인해보자
liverpool.loc[ [1,3,4], ["Name", "Speed"] ]
>>>
| Name | Speed | |
|---|---|---|
| 1 | Diaz | 88 |
| 3 | Nunez | 87 |
| 4 | MacAllister | 81 |
✅ 연속적인, 원하는 row, column에 접근
# 1번째~3번째 선수의 이름~패스까지의 능력치를 확인해보자
liverpool.loc[ 1:3, "Name" : "Pass"]
>>>
| Name | Attack | Pass | |
|---|---|---|---|
| 1 | Diaz | 85 | 85 |
| 2 | Jota | 81 | 87 |
| 3 | Nunez | 85 | 84 |
[!] []속에서의 슬라이싱이 아닌, 바로 슬라이싱을 이용
[!] 1:3의 경우 ㄹㅇ로 1,2,3 다가져옴 (Python의 일반적인 슬라이싱은 끝을 -1해서 처리하는데, 얘는 '이름'으로 인식해서 그런지 다 가져옴)
df.iloc[0,0] 으로 생각하면 되며,
각 요소자리(0,0)에는 Row와 Column의 인덱스(Index)를 넣어주면 된다.
인덱스를 넣는 방법은 인덱스숫자, 리스트, 슬라이싱이 있다.
| Name | Attack | Pass | Speed | Balance | |
|---|---|---|---|---|---|
| 0 | Salah | 89 | 81 | 81 | 88 |
| 1 | Diaz | 85 | 85 | 88 | 83 |
| 2 | Jota | 81 | 87 | 86 | 89 |
| 3 | Nunez | 85 | 84 | 87 | 84 |
| 4 | MacAllister | 84 | 82 | 81 | 86 |
✅ row, column 각 1개에만 접근
# Nunez의 Speed를 출력해보자
liverpool.iloc[3,3]
>>>
np.int32(87)
✅ 원하는 row, column에 접근
# Diaz와 Nunez의 'Name'과 'Balance'를 비교해보자
liverpool.iloc[ [1,3], [0,4] ]
>>>
| Name | Balance | |
|---|---|---|
| 1 | Diaz | 83 |
| 3 | Nunez | 84 |
✅ 연속적인(간격을 통해 커스텀 가능), 원하는 Row, Column에 접근
# 0번째~3번째 선수의 "Name", "Pass", "Balance"를 확인해보자
liverpool.iloc[ 0:4, 0:5:2]
>>>
| Name | Pass | Balance | |
|---|---|---|---|
| 0 | Salah | 81 | 88 |
| 1 | Diaz | 85 | 83 |
| 2 | Jota | 87 | 89 |
| 3 | Nunez | 84 | 84 |
[!] (앞서 loc와 다르게) Python의 슬라이싱 마지막은 -1이 되는점을 확인하자