인덱싱 (loc)
loc
(참고링크)는 location의 약자로 데이터프레임 인덱싱을 도와준다.
일반적으로 파이썬에서는 []
을 이용하여 리스트 인덱싱, 슬라이싱 등을 하는데 판다스 데이터프레임에서는 loc[]
를 통해 비슷한 일을 한다고 생각하면 편하다.
DataFrame.loc[name_row, name_column]
위가 기본적인 접근 방법으로 loc
는 행과 열의 이름으로 접근한다. 혹은 행과 열의 이름을 리스트로 넣어 접근할 수도 있다. 또한 :
을 이용하여 슬라이싱도 가능하고, 조건을 넣어서 접근할 수도 있다.
예를 들기 위해 아래와 같이 데이터를 불러오자.
import seaborn as sns
df = sns.load_dataset('titanic')
간단하게 데이터를 살펴보기 위해 head()
를 이용하여 출력하면 다음과 같다.
survived pclass sex age sibsp parch fare embarked class \
0 0 3 male 22.0 1 0 7.2500 S Third
1 1 1 female 38.0 1 0 71.2833 C First
2 1 3 female 26.0 0 0 7.9250 S Third
3 1 1 female 35.0 1 0 53.1000 S First
4 0 3 male 35.0 0 0 8.0500 S Third
who adult_male deck embark_town alive alone
0 man True NaN Southampton no False
1 woman False C Cherbourg yes False
2 woman False NaN Southampton yes True
3 woman False C Southampton yes False
4 man True NaN Southampton no True
이제 loc
를 이용하여 접근해보자. 예를 들어서 100번 승객의 성별에 접근한다면 아래와 같은 코드를 이용할 수 있다.
df.loc[100, 'sex']
결과는 아래와 같다.
'female'
이제 100번 승객, 200번 승객, 300번 승객의 성별과 객실 등급이 궁금할 수 있다. 이때 리스트를 이용한다.
df.loc[[100, 200, 300], ['sex', 'class']]
출력은 아래와 같다.
sex class
100 female Third
200 male Third
300 female Third
만약 다중 인덱스(MultiIndex)인 경우 ()로 묶어서 접근 가능한데, 자세한 내용은 loc
레퍼런스를 참고하면 된다.
슬라이싱도 가능하다. 위 정보를 보니 class부터 alive까지 정보가 필요하다고 해보자.
df.loc[[100, 200, 300], 'class':'alive']
그렇다면 출력은 아래와 같다.
class who adult_male deck embark_town alive
100 Third woman False NaN Southampton no
200 Third man True NaN Southampton no
300 Third woman False NaN Queenstown yes
그리고 슬라이싱에선 기존 파이썬 문법과 마찬가지로 생략하여 한쪽을 모두 포함시킬 수도 있다.
df.loc[[100, 200, 300], 'class':]
출력은 아래와 같다.
class who adult_male deck embark_town alive alone
100 Third woman False NaN Southampton no True
200 Third man True NaN Southampton no True
300 Third woman False NaN Queenstown yes True
역으로 양쪽 모두 생략하여 행이나 열 모두를 포함시킬 수도 있다.
df.loc[:, 'class']
출력은 아래와 같다.
0 Third
1 First
2 Third
3 First
4 Third
...
886 Second
887 First
888 Third
889 First
890 Third
Name: class, Length: 891, dtype: category
Categories (3, object): ['First', 'Second', 'Third']
앞서 조건을 통해서도 접근 가능하다고 말하였다. 예를 들어서 살아남은 사람들만 출력해보자.
print(df.loc[df['alive']=='yes'])
출력은 아래와 같다.
survived pclass sex age sibsp parch fare embarked class \
1 1 1 female 38.0 1 0 71.2833 C First
2 1 3 female 26.0 0 0 7.9250 S Third
3 1 1 female 35.0 1 0 53.1000 S First
8 1 3 female 27.0 0 2 11.1333 S Third
9 1 2 female 14.0 1 0 30.0708 C Second
.. ... ... ... ... ... ... ... ... ...
875 1 3 female 15.0 0 0 7.2250 C Third
879 1 1 female 56.0 0 1 83.1583 C First
880 1 2 female 25.0 0 1 26.0000 S Second
887 1 1 female 19.0 0 0 30.0000 S First
889 1 1 male 26.0 0 0 30.0000 C First
who adult_male deck embark_town alive alone
1 woman False C Cherbourg yes False
2 woman False NaN Southampton yes True
3 woman False C Southampton yes False
8 woman False NaN Southampton yes False
9 child False NaN Cherbourg yes False
.. ... ... ... ... ... ...
875 child False NaN Cherbourg yes True
879 woman False C Cherbourg yes False
880 woman False NaN Southampton yes False
887 woman False B Southampton yes True
889 man True C Cherbourg yes True
[342 rows x 15 columns]
&
|
을 통해 여러 조건을 같이 넣을수도 있다. 예를 들어서 나이가 70살 이상인 일등석 승객을 출력해보자.
df.loc[(df['age']>=70) & (df['class']=='First')]
이때 조건을 괄호로 잘 감싸주어야 한다. 출력은 아래와 같다.
survived pclass sex age sibsp parch fare embarked class who \
96 0 1 male 71.0 0 0 34.6542 C First man
493 0 1 male 71.0 0 0 49.5042 C First man
630 1 1 male 80.0 0 0 30.0000 S First man
745 0 1 male 70.0 1 1 71.0000 S First man
adult_male deck embark_town alive alone
96 True A Cherbourg no True
493 True NaN Cherbourg no True
630 True A Southampton yes True
745 True B Southampton no False
이때 조건을 넣은 것은 행에 조건을 넣은 것이기에 특정 열의 값만 보는 것도 가능하다.
이렇게 데이터프레임에 접근했다면 해당 값을 변경하는 것 역시 가능하다. 예를 들어서 100번 승객의 성별을 여성으로 설정하고 싶다면 다음과 같이 하면 된다.
df.loc[100, 'sex'] = 'female'
여러 값을 한번에 바꾸는 것도 가능하다. 예를 들어서 일등석 승객을 모두 살아있는 상태로 설정하고 싶다면 다음과 같이 하면 된다.
df.loc[df['class'] == 'First', 'alive'] = 'yes'
여기에 +=
, -=
등을 이용하는 것 역시 가능하다.
인덱싱 (iloc)
iloc
(참고링크)는 integer location의 약자로 앞서 loc
가 행이나 열의 이름을 기준으로 데이터프레임 인덱싱을 진행했다면 iloc
는 인덱스 넘버를 기준으로 인덱싱을 진행한다.
예를 들어서 다시 타이타닉 셋을 가져와보자.
import seaborn as sns
df = sns.load_dataset('titanic')
이제 아까처럼 100번 승객의 성별에 접근하려 해보자.
df.iloc[100, 'sex']
오류가 뜬다. 성별의 인덱스를 확인하기 위해 info()
를 통해 접근해보면 다음과 같다.
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 survived 891 non-null int64
1 pclass 891 non-null int64
2 sex 891 non-null object
3 age 714 non-null float64
4 sibsp 891 non-null int64
5 parch 891 non-null int64
6 fare 891 non-null float64
7 embarked 889 non-null object
8 class 891 non-null category
9 who 891 non-null object
10 adult_male 891 non-null bool
11 deck 203 non-null category
12 embark_town 889 non-null object
13 alive 891 non-null object
14 alone 891 non-null bool
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.7+ KB
None
즉 성별의 인덱스는 2이다. 따라서 100번 승객의 성별에 접근하려면 다음과 같은 코드를 이용해야 한다.
df.iloc[100, 2]
출력은 다음과 같다.
'female'
아까와 동일하다. 참고로 타이타닉 데이터셋은 행이 이미 0부터 시작하는 수로 되어 있기 때문에 loc
로 접근할 때와 iloc
로 접근할 때 동일하게 사용하였지만, 만약 행 이름이 1부터 시작하는 수이거나, 아예 다르게 되어 있다면 성별에 접근할 때와 마찬가지로 인덱스를 확인하고 접근해야 한다.
그 외 리스트를 이용하여 여러 행, 열에 접근하거나, 슬라이싱하거나, 조건을 통해 접근하는 것은 loc
와 같으니 위를 참고하면 된다.
단일값 접근 (at, iat)
at
(참고링크), iat
(참고링크)는 단일 값에만 접근한다는 것이 특징이다.
예를 들어 아래와 같이 단일 값에 접근할 때를 가정하자.
df.iloc[100, 2]
그렇다면 굳이 iloc
를 사용하지 말고 iat
을 사용하면 된다.
df.iat[100, 2]
at
역시 비슷하다.
at
, iat
는 단일 값 접근만 가능해서 loc
, iloc
와 비교하면 범용성이 떨어진다. 그러나 단일 값 접근 시 loc
, iloc
대비 빠르기 때문에 단일 값 접근이라면 at
, iat
를 사용하는 것이 좋다.
'Data Science > Pandas' 카테고리의 다른 글
[Pandas] 녹이기(melt)와 피벗(pivot)을 통한 데이터프레임 재구조화 (0) | 2025.01.06 |
---|---|
[Pandas] 데이터 연결(concatenate) 및 결합(merge), 그리고 간단 결합(join) (0) | 2024.12.30 |
[Pandas] 값 혹은 인덱스를 기준으로 데이터프레임 정렬 (0) | 2024.12.29 |
[Pandas] 판다스를 통한 데이터 시각화(data visualization) (0) | 2024.12.28 |
[Pandas] 데이터프레임 기초 통계량 확인 (0) | 2024.12.26 |