1. 예시 & 데이터 프레임
https://gibles-deepmind.tistory.com/36?category=904126
(데이터 참조)
import pandas as pd
data = pd.read_csv("C:/blarblar/aug_train.csv")
data.loc[:, ['city', 'enrollee_id']].head()
2. 왜 데이터를 선택해야 하는가? - 시간과 공간의 한계
data
data를 그대로 출력해보자.
두 가지 표시가 눈에 띈다. 하나는 ... 이고 다른 하나는 19185행과 14개의 열로 이루어져 있다는 문구이다. 우선, ...은 할말이 없다는 뜻이 아니고 ㅈㅅ 너무 많아서 표시를 생략했다는 뜻이다. 물론, 설정을 통해 display되는 양을 조절할 수도 있다. 하지만, 그마저도 제한이 있다.
또한, 19000행은 결코 작은 숫자가 아니다. 우리는 일일이 1만 9천개에 달하는 행을 하나씩 읽어가며 특징을 살필 수 없다.
그렇기 때문에, 데이터 프레임의 "일부"를 선택할 수 있는 수단이 필요하다.
https://stackoverflow.com/questions/27238066/what-is-the-point-of-indexing-in-pandas
실제로 loc 등의 pandas indexing 기법을 썼을 때, 속도가 더 빠르다. 자세한 내용은 글 참조.
3. 어떻게 선택할 것인가? 방식의 문제
3-1. 기본형
기본적으로, 세 가지 방식으로 데이터프레임의 일부를 추출할 수 있다.
1. 특정 열을 선택하기
#하나의 열만 선택하기
data['city']
data.city
#여러 열 선택하기
data[['city', 'gender']]
하나의 행을 선택할 경우, Series 자료형으로 출력된다. 자료구조는 나중에 다른 글에서 설명하겠다.
2. 특정 범위의 행을 선택하는 경우
data[5:10]
data[n:m] -> n행에서 m-1행까지를 출력한다.
3. 특정 조건의 값만 선택하는 경우
cond = (data.gender == 'Male')
data[cond].head()
다음으로, 위와 같이 특정 조건을 설정하여 해당하는 값만 출력할 수 있다.
지금까지는 행과열 각각을 따로 분리하여 출력을 했었다. 지금부터는 두 가지를 복합적으로 고려하여 출력을 진행해볼 것이다.
3-2. iloc
iloc는 행과 열을 선택할 수 있는 판다스 메서드 중 하나이다. 특이한 점은 iloc는 "숫자"를 기준으로 행과 열을 선택한다. 그렇다면, 여기서 "숫자"는 어떤 숫자인가?
각 행과 열의 위치를 의미한다. 즉, col1은 첫 번째 열(=0)이 되고 col2는 두번째 열(=1)이 되는 것이다.
data.iloc[0, 0]
이렇게 할 경우, 첫 번째 행의 첫 번째 열을 출력하라는 의미가 된다.
파이썬의 "시작"은 0이라는 것을 기억하자.
인자로는 총 3가지의 타입을 받을 수 있다.
1. list : [2, 3, 4] |
2. slice : [2:5] |
3. value : 3 |
data.iloc[2:5, 2:5]
data.iloc[[2, 3, 4], [2, 3, 4]]
위와 같이 단일 값외에 리스트와 slice 형태도 값으로 들어갈 수 있다. 두 코드의 결과는 같다.
3-3. loc
loc는 iloc와 반대로 "문자열"을 값으로 받는다.
data.loc[:, ['city', 'gender']].head()
: 는 모든 행을 출력하라는 의미이다. 위와 같이 'city', 'gender' 두가지 열에 대해 모든행을 출력할 수 있다. 근데, 잠깐 이거 아까 어디서 본거 아냐?
맞다. 사실 위 결과는 data[['city', 'gender']] 와 똑같다. 사실, loc의 꽃은 data.loc[행 선택, 열 선택] 데이터프레임에서 행을 선택하는 방식에 있다.
loc의 행을 선택하는 방식은 크게 세 가지가 있다.
1. single index값 : 'Male' 또는 그냥 숫자 0 도 가능 |
2. index list : ['Male', 'Female'] |
3. 조건 : gender == 'Male' |
data.loc[0, 'city']
예를 들어, 위와 같이 index값을 숫자 그대로 받아 올 수도 있다. 오잉? 위에는 문자열을 받아 온다더니? 그렇긴 하다만, "문자열"이 값일 경우 그대로 받아올 수 있다는 의미이지, 문자열 받아올 수 있다는 의미는 아니다. index 자체의 값을 그대로 들고 왔다고 생각하면 된다.
여기서, 0에 해당하는 값을 "문자열"로 받아올 수도 있다. 이를 위해 약간의 조작을 가해보자.
data.set_index('gender')
쌩뚱맞지만, gender를 index로 조정해보았다.
data.set_index('gender').loc['Male', ['city', 'city_development_index']].head()
그리고, 여기서 위와 같이 행을 선택하는 자리 'Male'을 입력하여 값을 출력할 수 있다. 왜? 이제 gender가 index가 됐기 때문이다.
근데, 굳이 저렇게 출력할 필요는 없다. 왜냐하면, "조건"을 입력할 수도 있기 때문이다.
cond = (data.gender == 'Male')
data.loc[cond, ['city', 'gender']].head()
data.loc[(data.gender == 'Male'), ['city', 'gender']].head()
조건은 두 가지 방식으로 입력할 수 있다. cond와 같이 변수에 할당할 수도 있고 loc안에 직접 입력할 수도 있다. 만약에 조건을 두 가지로 써주고 싶다면?
data.loc[(data.gender == 'Male')&(data.city == 'city_103'), ['city', 'gender']].head()
위와 같이 &를 활용해주면 된다. 그런데, 한 변수 안에서 여러 값을 출력하고 싶을 때도 있다.
target_list = ['Male', 'Female']
cond = (data.gender.isin(target_list))
data.loc[cond, ['city', 'gender']].head()
그럴때는 위와 같이 isin을 사용해주면 된다. 참고로 isin은 리스트를 파라미터로 받을 수 있기 때문에 위와 같이 리스트를 따로 만들어 사용하면 편하다.
3-4. 그러면 iloc에서는 행 선택시 조건을 부여할 수 없나요?
약간의 꼼수를 부리면 할 수 있기는 하다.
data.iloc[:, [1, 2, 3, 4, 5]].query('gender == "Male"').head()
query라는 방법을 사용하면 가능하기는 하다. 하지만, 위에 대응 시킨 것처럼 iloc 선택 범위안에 query에서 지정한 열 값이 들어가 있어야 한다. 우선은 loc에 익숙해져 보는게 좋은 것 같다.
'딥상어동의 딥한 데이터 처리 > 전처리' 카테고리의 다른 글
[Pandas] str.contains를 사용하는 이유 - 정규표현식 (0) | 2021.09.26 |
---|---|
[Pandas] 이것만은 알고가자 - 2.Basic Function (0) | 2021.06.07 |
[Pandas] 이것만은 알고가자 - 0.파일 불러오기 (0) | 2021.06.05 |
시계열 | 이동 평균(Moving Average) 기초 (0) | 2021.05.02 |
Pandas | Melt (0) | 2021.03.02 |
제 블로그에 와주셔서 감사합니다! 다들 오늘 하루도 좋은 일 있으시길~~
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!