[Pandas] DataFrame Indexing - loc, iloc

olxtar·2024년 9월 19일
post-thumbnail

Comment :

Python - Pandas의 DataFrame은 행(Row)과 열(Column)으로 이루어진 데이터 구조이며 DataFrame에서 필요한 데이터만 뽑아내는 작업을 인덱싱(Indexing)이라고 한다.
아래와 같은 3가지 종류의 인덱싱 방법이 있으며 예시들을 통해서 각 인덱싱 방법을 알아보자

  • Direct Indexing : df[]
  • loc : df.loc[]
  • iloc : df.iloc[]

[+] 슬라이싱(Slicing) : 시퀀스 데이터, 즉 리스트, 문자열, 튜플같은 데이터 타입에서 특정부분을 추출하는 방법. 기본문법은 다음과 같음 seq[시작 : 끝 : 간격]


00. Settings

먼저 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





01. Direct Indexing

(맞는 용어는 아니지만 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





02. loc

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해서 처리하는데, 얘는 '이름'으로 인식해서 그런지 다 가져옴)






03. iloc

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이 되는점을 확인하자

profile
예술과 기술

0개의 댓글