데이터분석 : 1. 데이터 생성 및 읽기
데이터분석 : 2. 인덱싱, 선택 및 할당
데이터분석 : 3. 요약 기능 및 맵
데이터분석 : 4. 그룹화 및 정렬
데이터분석 : 5. 데이터 유형 및 결측값
데이터분석 : 6. 이름 변경 및 결합
reviews.country
0 Italy
1 Portugal
...
129969 France
129970 France
Name: country, Length: 129971, dtype: object
reviews['country']
0 Italy
1 Portugal
...
129969 France
129970 France
Name: country, Length: 129971, dtype: object
이 두 가지 방법은 DataFrame에서 특정 Series를 선택하는 방법이다.
어느 방법이 문법적으로 더 유효하거나 유효하지 않은 것은 아니지만, 인덱싱 연산자 []는 예약된 문자가 포함된 열 이름을 처리할 수 있는 장점이 있다.
단일 특정 값을 찾기 위해 인덱싱 연산자 []를 한 번 더 사용할 수 있다.
reviews['country'][0]
'Italy'
reviews.iloc[0]
country Italy
description Aromas include tropical fruit, broom, brimston...
...
variety White Blend
winery Nicosia
Name: 0, Length: 13, dtype: object
reviews.iloc[:, 0]
0 Italy
1 Portugal
...
129969 France
129970 France
Name: country, Length: 129971, dtype: object
reviews.iloc[:3, 0]
0 Italy
1 Portugal
2 US
Name: country, dtype: object
reviews.iloc[1:3, 0]
1 Portugal
2 US
Name: country, dtype: object
reviews.iloc[[0, 1, 2], 0]
0 Italy
1 Portugal
2 US
Name: country, dtype: object
reviews.iloc[-5:]
레이블 기반 선택은 속성 선택의 두 번째 패러다임이다.
이 패러다임에서는 위치가 아닌 데이터 인덱스 값이 중요합니다.
reviews.loc[0, 'country']
'Italy'
reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']]
- iloc은 Python 표준 라이브러리 인덱싱 방식을 사용한다. 범위의 첫 번째 요소는 포함되고 마지막 요소는 제외된다. 따라서 0:10은 0부터 9까지의 항목을 선택한다.
반면 loc은 포함적으로 인덱싱한다. 따라서 0:10은 0부터 10까지의 항목을 선택한다.
이는 데이터프레임의 인덱스가 간단한 숫자 리스트인 경우에 특히 혼동을 줄 수 있다. 예를 들어 0,...,1000인 경우 df.iloc[0:1000]은 1000개의 항목을 반환하고, df.loc[0:1000]은 그 중 1001개를 반환한다.
loc을 사용하여 1000개의 요소를 가져오려면 하나 낮게 가서 df.loc[0:999]와 같이 요청해야 합니다.
- df.iloc[0:1000] 0~999 1000개 반환.
df.loc[0:1000] 0~1000 1001개 반환한다.
그렇지 않은 경우에는 loc을 사용하는 의미론적 측면은 iloc을 사용하는 경우와 동일합니다.
reviews.set_index("title")
지금까지는 데이터프레임의 구조적 속성을 사용하여 데이터의 다양한 부분을 인덱싱해왔다.
그러나 데이터를 활용하여 더 고급의 작업을 수행하려면 그에 맞는 조건을 부여해야한다.
예를 들어, 우리가 특히 이탈리아에서 생산된 평균보다 좋은 와인에 관심이 있다면,
reviews.country == 'Italy'
0 True
1 False
...
129969 False
129970 False
Name: country, Length: 129971, dtype: bool
reviews.loc[reviews.country == 'Italy']
이 DataFrame은 약 20,000개의 행을 가지고 있고, 원본 데이터셋은 약 130,000개의 행을 가지고 있었으므로 이는 와인 중 약 15%가 이탈리아에서 생산된 것을 의미한다.
또한, 우리는 평균 이상의 와인을 알고 싶었다.
와인은 80에서 100점의 점수 체계로 평가되기 때문에, 이는 적어도 90점 이상을 받은 와인을 의미한다고 볼 수 있다.
이 두 가지 질문을 함께 결합하기 위해 ampersand (&)를 사용할 수 있다.
reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)]
reviews.loc[(reviews.country == 'Italy') | (reviews.points >= 90)]
isin() 메서드는 주어진 리스트의 값에 해당하는 데이터를 선택하는 데 사용된다.
예를 들어, 이 코드는 이탈리아나 프랑스에서 생산된 와인만 선택하는 방법을 보여준다.
'country' 열의 값이 'Italy' 또는 'France'에 속하는 경우에만 선택된다.
reviews.loc[reviews.country.isin(['Italy', 'France'])]
isnull() 메서드는 값이 비어 있거나 NaN(숫자가 아님)인 경우 해당 값을 선택하는 데 사용된다.
reviews.loc[reviews.price.notnull()]
reviews['critic'] = 'everyone'
reviews['critic']
0 everyone
1 everyone
...
129969 everyone
129970 everyone
Name: critic, Length: 129971, dtype: object
or
reviews['index_backwards'] = range(len(reviews), 0, -1)
reviews['index_backwards']
0 129971
1 129970
...
129969 2
129970 1
Name: index_backwards, Length: 129971, dtype: int64