DataFrame 고급 인덱싱
DataFrame에서 특정한 데이터만 골라내는 것을 인덱싱이라고 합니다. 앞 절에서는
column에 대해 label, label list 인덱싱을, row에 대해 index(정수) 슬라이스 총 3가지 방식을 사용하여 데이터를 추출하는 방법을
살펴 봤습니다.
그런데 Pandas는 NumPy 배열과 같이 콤마(,)를 사용한 (row 인덱스, column 인덱스) 형식의 2차원 인덱싱을 지원하기 위해
다음과 같은 특별한 인덱서(indexer) 속성도 제공합니다.
- loc : label 값 기반의 2차원 인덱싱
- iloc : 순서를 나타내는 정수 기반의 2차원 인덱싱
df.loc[row 인덱싱 값]
df.loc[row 인덱싱 값, column 인덱싱 값]
DataFrame 고급 인덱싱 - loc 인덱서
이 때 인덱싱 값은 다음 중 하나입니다. row 인덱싱 값은 정수 또는 row index 데이터이고 column 인덱싱 값은 label 문자열입니다.
- index 데이터
- index 데이터 슬라이스
- index 데이터 리스트
- 같은 row 인덱스를 가지는 boolean Series (row 인덱싱의 경우)
- 또는 위의 값들을 반환하는 함수
만약 loc 인덱서를 사용하면서 인덱스를 콤마 없이 하나만 넣으면 row을 선택합니다.
인덱스 데이터가 "a"인 행을 고르면 해당하는 row가 Series로 반환됩ㄴ디ㅏ. Series라서 상하로 길게 표현되기는 했지만
row를 가져오고 있습니다.
df.loc['a']
# 슬라이스도 가능합니다. 사실 loc를 쓰지 않을 때와 결과가 같습니다.
df.loc["b":"c"]
# 인덱스 데이터의 리스트 자료형도 사용 가능합ㅎ니다. 이 때는 loc를 쓰지 않으면 KeyError 오류가 발생합니다.
df.loc[["b","c"]]
Boolean Series로 row를 기준으로 인덱싱 할 수 있습니다. 아래 예제에서는 df.A(영어 문자열은 속성처럼 접근 가능)의 값 중 15 초과인 결과를 Boolean Series 값을 얻을 수 있습니다.이 Boolean Series를 활용해 인덱싱하고 있습니다. 이는 데이터베이스와 같이 인덱스를 가지는 Boolean Series도 row를 선택하는 인덱싱 값으로 쓸 수 있습니다.
df.A > 15
df.loc[df.A > 15]
callable한 함수를 만들어서 인덱싱하는데 사용할 수 있습니다. 다음 함수는 A열의 값이 10보다 큰 row만 선택합니다.
def select_rows(df, num):
return df.A > num
select_rows(df, 10)
df.loc[select_rows(df, 10)]
- loc 인덱서는 column label 인덱싱이나 column label 리스트 인덱싱(컬럼)은 불가능합니다
loc 인덱서 vs iloc 인덱서
- (주의사항) row 인덱스 값이 아래의 예제처럼 default로 주어지는 정수로 생성된 DataFrame의 경우에는 슬라이싱 마지막 숫자가 포함된 결과를 가져옵니다.
- 원래 row 인덱스 값이 정수인 경우에는 마지막 값이 포함됩니다.
- loc는 마지막 숫자 포함, iloc는 마지막숫자 미포함
df2.loc[1:2] # 행 1,2 출력
df2.iloc[1:2] # 행 1만 출력
loc 인덱서 정리
@그림대체
인덱싱 값을 row와 column 모두 받으려면 df.loc[row 인덱스, column 인덱스]와 같은 형태로 사용합니다.
row 인덱스 label 값이 A인 위치의 값을 구하는 것은 다음과 같습니다.
df.loc['a','A']
앞서 본 콤마로 구분된 인덱싱 값으로 label 데이터에 슬라이싱 또는 리스트도 사용할 수 있습니다.
df.loc['a',:]
df.loc[['A','B'], ['B','D']]
row 인덱스가 같은 boolean Series나 이러한 boolean Series를 반환하는 함수도 Row 인덱싱 값이 될 수 있습니다.
df.loc[df.A > 10 , ['C',[['D']
Iloc 인덱서 정리
iloc 인덱서는 loc 인덱서와 반대로 label이 아니라 순서를 나타내는 정수(inteeger) 인덱스만 받습니다.
다음 사함은 loc 인덱서와 같습니다.
데이터 개수 세기
Pandas는 Numpy 2차원 배열에서 가능한 대부분의 처리가 가능합니다. 또 데이터 변환 처리 및 변환을 위한 다양한 함수에 가장 간단한 분석은 데이터의 개수를 세는 것입니다.
df.count()
Series 카테고리 값 세기
Series 값이 정수, 문자열, 카테고리 값인 경우에는 value_counts() 메서드로 각각의 값이 나온 횟수를 셀 수 있습니다.
np.random.seed(1)
s2 = pd.Series(np.random.randint(6, size = 100))
s2.value_counts()
DataFrame에는 value_counts() 메서드는 리스트 형태의 값을 첫 인자로 전달합니다. 이 리스트는 column label을 요소로 갖습니다. NaN 값이 있는 row는 개수로 안칩니다.
titanic.value_counts('class')
DataFrame에는 value_counts 메서드가 없으므로 각 column(Sereis)마다 별도로 적용해야 합니다.
Series 정렬 - index 기준
데이터를 index 순으로 정렬하려면 sort_index()를, value를 기준으로 정렬하려면 메서드 sort_values 메서드를 사용합니다.
앞의 예제에서 index로 정의되지 않았던 s2.value_counts()의 반환값(Series)에 sort_index를 적용하면 아래와 같이
정렬된 결과를 볼 수 있습니다.
s2.value_counts().sort_index()
Series 정렬 - value 기준
value를 기준으로 정렬할 때 NaN 값이 있는 경우가 있을 수 있습니다. 이 경우에는 정렬하면 아래 예제와 같이 NaN값이 가장 나중으로 위치하게 됩니다.
s2.sort_values()
Series 정렬 - 내림차순
큰 수에서 작은 수로, 내림차순(오름차순의 반대)로 정렬하려면 ascending = False와 같이 키워드 인수를 지정합니다.
s.sort_values(ascending = False)
DataFrame 정렬
DataFrame에서 sort_values 메서드를 사용하려면 by 키워드 인수를 활용하여 DataFrame의 정렬 기준이 되는 column을 지정해줍니다.
df.sort_values(by = 'age')
- DataFrame은 테이블형태이므로 1개 column만 정렬하는 것이 아닌 1개 column을 기준으로 다른 column도 모두 정렬합니다.
- by 키워드 인수에 전달할 값으로 리스트 자료형의 형태로 지정할 수 있습니다. 이때는 요소의 순서대로 정렬기준의 우선순위가 됩니다.
df.sort_values(by = ['age','name'])
DataFrame 행/열 합계
row와 column의 합계를 구할 때는 sum(axis) 메서드를 사용합니다. axis 인수에는 합계로 인해 없어지는 방향축(0 = row, 1 = column)을 지정합니다. row의 집계를 구할 때는 sum(axis = 1) 메서드를 사용합니다.
np.random.seed(1)
df2 = pd.DataFrame(np.random.randint(10, size = (4,8))
# 열 방향
df2.sum(axis = 1)
# 행 방향
df2['RowSum'] = df2.sum(axis = 1)
column 합계를 구할 때는 sum(axis = 0) 메서드를 사용하는데 axis 인수의 디폴트 값이 0이므로 axis 인수를 생략할 수 있습니다.
df2.sum()
mean() 메서드는 평균을 구하며 앞서 설명한 sum() 메서드와 사용법이 같습니다. axis 인수에는 집계로 인해 없어지는 방향축(0 = row, 1 = column)을 지정합니다.
df2.mean()
df2.loc['ColTotal', :] = df2.mean()
'데이터 분석 및 시각화 > 파이썬' 카테고리의 다른 글
[Python] 기초정리(Pandas(Merge, 시계열 자료, Groupby)) (0) | 2023.01.20 |
---|---|
[Python] 기초 정리(Pandas_DataFrame3) (0) | 2023.01.20 |
[Python] 클래스 연습문제 (1) | 2023.01.18 |
[Python] 기초 정리(Pandas_DataFrame) (0) | 2023.01.18 |
[Python] 기초 정리(Pandas_Series) (2) | 2023.01.18 |