내 의견으로는, 누락 된 값 만있는 DataFrame을 사용하기 때문에 허용되는 대답이 혼란 스럽습니다. 나는 또한 용어처럼하지 않는 위치에 기반 을 위해 .iloc
대신, 선호하는 위치의 정수 훨씬 더 자세한 설명과 정확히 같은 .iloc
의미합니다. 핵심 단어는 정수입니다- .iloc
정수가 필요합니다.
자세한 내용 은 서브셋 선택에 대한 매우 자세한 블로그 시리즈 를 참조하십시오.
.ix는 더 이상 사용되지 않으며 모호하므로 절대 사용해서는 안됩니다.
때문에 .ix
IS가되지 않는 우리는 차이점에 초점을 맞출 것이다 .loc
및 .iloc
.
차이점에 대해 이야기하기 전에 DataFrame에 각 열과 각 인덱스를 식별하는 데 도움이되는 레이블이 있다는 것을 이해해야합니다. 샘플 DataFrame을 살펴 보겠습니다.
df = pd.DataFrame({'age':[30, 2, 12, 4, 32, 33, 69],
'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
'height':[165, 70, 120, 80, 180, 172, 150],
'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
},
index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])
굵게 표시된 모든 단어 는 레이블입니다. 라벨은, age
, color
, food
, height
, score
및 state
에 사용되는 열 . 다른 레이블, Jane
, Nick
, Aaron
, Penelope
, Dean
, Christina
, Cornelia
에 사용되는 인덱스 .
DataFrame에서 특정 행을 선택하는 기본 방법은 .loc
및 .iloc
인덱서를 사용하는 것입니다. 이 인덱서는 각각 동시에 열을 선택하는 데 사용할 수 있지만 지금은 행에 집중하는 것이 더 쉽습니다. 또한 각 인덱서는 이름 바로 다음에 오는 일련의 대괄호를 사용하여 선택합니다.
.loc은 레이블로만 데이터를 선택합니다.
먼저 .loc
인덱스 또는 열 레이블로 데이터를 선택 하는 인덱서 에 대해 이야기하겠습니다 . 샘플 DataFrame에서 인덱스의 값으로 의미있는 이름을 제공했습니다. 많은 DataFrame에는 의미있는 이름이 없으며 대신 0에서 n-1 사이의 정수로 기본 설정됩니다. 여기서 n은 DataFrame의 길이입니다.
사용할 수있는 세 가지 입력이 있습니다 .loc
- 끈
- 문자열 목록
- 문자열을 시작 및 중지 값으로 사용하는 슬라이스 표기법
문자열이있는 .loc을 사용하여 단일 행 선택
단일 데이터 행을 선택하려면 다음에 괄호 안에 색인 레이블을 배치하십시오 .loc
.
df.loc['Penelope']
이것은 데이터 행을 시리즈로 리턴합니다.
age 4
color white
food Apple
height 80
score 3.3
state AL
Name: Penelope, dtype: object
문자열 목록이있는 .loc을 사용하여 여러 행 선택
df.loc[['Cornelia', 'Jane', 'Dean']]
목록에 지정된 순서대로 행이있는 DataFrame을 반환합니다.
슬라이스 표기법이있는 .loc를 사용하여 여러 행 선택
슬라이스 표기법은 시작, 중지 및 단계 값으로 정의됩니다. 레이블로 슬라이스 할 때 팬더는 리턴 값에 중지 값을 포함합니다. Aaron에서 Dean까지 다음 조각이 포함됩니다. 단계 크기는 명시 적으로 정의되어 있지 않지만 기본값은 1입니다.
df.loc['Aaron':'Dean']
복잡한 슬라이스는 Python 목록과 같은 방식으로 가져올 수 있습니다.
.iloc은 정수 위치로만 데이터를 선택합니다
이제로 넘어 갑시다 .iloc
. DataFrame의 모든 데이터 행과 열에는이를 정의하는 정수 위치가 있습니다. 이것은 출력에 시각적으로 표시되는 레이블에 추가됩니다 . 정수 위치는 단순히 0에서 시작하는 상단 / 왼쪽의 행 / 열 수입니다.
사용할 수있는 세 가지 입력이 있습니다 .iloc
- 정수
- 정수 목록
- 시작 및 중지 값으로 정수를 사용하는 슬라이스 표기법
정수가있는 .iloc을 사용하여 단일 행 선택
df.iloc[4]
5 번째 행 (정수 위치 4)을 Series로 반환합니다.
age 32
color gray
food Cheese
height 180
score 1.8
state AK
Name: Dean, dtype: object
정수 목록이있는 .iloc을 사용하여 여러 행 선택
df.iloc[[2, -2]]
세 번째와 두 번째 행부터 마지막 행까지의 DataFrame을 반환합니다.
슬라이스 표기법이있는 .iloc을 사용하여 여러 행 선택
df.iloc[:5:3]
.loc 및 .iloc을 사용하여 행과 열을 동시에 선택
두 가지의 뛰어난 기능 중 하나 .loc/.iloc
는 행과 열을 동시에 선택할 수 있다는 것입니다. 위의 예에서 모든 열은 각 선택 항목에서 반환되었습니다. 행과 동일한 입력 유형을 가진 열을 선택할 수 있습니다. 행과 열 선택을 쉼표로 구분하면 됩니다.
예를 들어 다음과 같이 열 높이, 점수 및 상태만으로 Jane과 Dean 열을 선택할 수 있습니다.
df.loc[['Jane', 'Dean'], 'height':]
행의 레이블 목록과 열의 슬라이스 표기법을 사용합니다.
.iloc
정수만 사용하여 자연스럽게 유사한 작업을 수행 할 수 있습니다 .
df.iloc[[1,4], 2]
Nick Lamb
Dean Cheese
Name: food, dtype: object
라벨과 정수 위치를 통한 동시 선택
.ix
유용하지만 때로는 혼란스럽고 모호한 레이블 및 정수 위치와 동시에 선택하는 데 사용되었으며 고맙게도 더 이상 사용되지 않습니다. 레이블과 정수 위치를 혼합하여 선택해야하는 경우 선택 레이블 또는 정수 위치를 모두 선택해야합니다.
우리가 행을 선택하려는 경우 예를 들어, Nick
및 Cornelia
열 2, 4와 함께를, 우리가 사용할 수있는 .loc
다음과 라벨에 정수를 변환 :
col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names]
또는 get_loc
index 메소드 를 사용하여 인덱스 레이블을 정수로 변환하십시오 .
labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]
부울 선택
.loc 인덱서는 부울 선택을 수행 할 수도 있습니다. 우리가 모든 행을 찾는 데 관심이 있다면 예를 들어, 연령은 30 위에 반환 단지 wher food
과 score
열이 우리가 다음을 수행 할 수 있습니다 :
df.loc[df['age'] > 30, ['food', 'score']]
이것을 복제 .iloc
할 수 는 있지만 부울 시리즈를 전달할 수는 없습니다. 부울 시리즈를 다음과 같이 numpy 배열로 변환해야합니다.
df.iloc[(df['age'] > 30).values, [2, 4]]
모든 행 선택
.loc/.iloc
열 선택에만 사용할 수 있습니다 . 다음과 같이 콜론을 사용하여 모든 행을 선택할 수 있습니다.
df.loc[:, 'color':'score':2]
인덱싱 연산자 인 []
은 행과 열을 동시에 선택할 수는 없습니다.
대부분의 사람들은 열을 선택하는 DataFrame 인덱싱 연산자의 기본 목적에 익숙합니다. 문자열은 단일 열을 Series로 선택하고 문자열 목록은 여러 열을 DataFrame으로 선택합니다.
df['food']
Jane Steak
Nick Lamb
Aaron Mango
Penelope Apple
Dean Cheese
Christina Melon
Cornelia Beans
Name: food, dtype: object
목록을 사용하여 여러 열을 선택합니다
df[['food', 'score']]
사람들이 익숙하지 않은 것은 슬라이스 표기법을 사용할 때 행 레이블 또는 정수 위치로 선택이 발생한다는 것입니다. 이것은 매우 혼란스럽고 거의 사용하지 않는 것이지만 작동합니다.
df['Penelope':'Christina'] # slice rows by label
df[2:6:2] # slice rows by integer location
명확성의 .loc/.iloc
선택 행에 대해 매우 바람직하다. 인덱싱 연산자만으로는 행과 열을 동시에 선택할 수 없습니다.
df[3:5, 'color']
TypeError: unhashable type: 'slice'