5. 데이터 검색 (조건에 맞는 데이터 추출)
1) 행단위 조건 검색
# 단일 조건
- 기본적인 비교식 사용
1
|
>>> 성적표.query('국어 > 90')
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
# And 조건 사용
1
|
>>> 성적표.query('국어 > 80 and 수학 > 80')
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
# Or 조건 사용
1
|
>>> 성적표.query('국어 < 70 or 수학 < 70')
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
# in 조건 사용
- 특정 리스트의 원소중 겹치는 값 찾기
1
2
3
4
|
>>> item = [98, 88]
>>> print(item)
[98, 88]
|
cs |
1
|
>>> 성적표.query('국어 in @item')
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
# not in 조건 사용
- 특정 리스트의 원소와 겹치지 않는 값 찾기
1
|
>>> 성적표.query('국어 not in @item')
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
2) 열단위 필터링
- 칼럼을 이용하여 열단위로 추출
1
2
|
# 열 필터링 --> 추출할 컬럼의 이름을 리스트로 전달한다.
>>> 성적표.filter(['국어','영어'])
|
cs |
◆ 결과
국어 | 영어 | |
호영 | 120 | 50.0 |
철수 | 98 | NaN |
영희 | 88 | 90.0 |
수현 | 63 | 60.0 |
민수 | 92 | 70.0 |
6. 행, 열 추가
1) 행 추가
- 원본데이터가 변경될 경우 에러 발생시 처음부터 실행할 수 없으므로 복사본을 만들어 진행하는것이 좋다
1
2
3
|
>>> 복사본 = 성적표.copy()
>>> 복사본
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
A) 리스트 활용
- 원본자체가 수정됨 (inplace = True 불필요)
- 추가될 행의 인덱스 이름을 지정
- 리스트로 추가할 경우 dataframe의 컬럼 순서에 맞게 지정
- 누락되는 값이 있거나 값의 수가 초과될 경우 에러
1
2
3
|
>>> 복사본.loc['영민'] = [3, '남자', 90, 80, 90, 62]
>>> 복사본
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
영민 | 3 | 남자 | 90 | 80.0 | 90.0 | 62.0 |
'영민'이라는 행이 추가됨.
B) 딕셔너리를 사용한 행 추가
- 컬럼의 순서는 상관없다
- 누락되는 값이 있거나 값의 수가 초과될 경우 에러
- 빈값을 적용해야 하는 경우 None이라고 지정
1
2
3
|
>>> 복사본.loc['민정'] = {'국어': 81, '영어': 72, '과학': 90, '수학': 84, '성별': '여자', '학년': 2}
>>> 복사본
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
영민 | 3 | 남자 | 90 | 80.0 | 90.0 | 62.0 |
민정 | 2 | 여자 | 81 | 72.0 | 84.0 | 90.0 |
'민정' 이라는 행이 추가됨.
C) 기존의 행을 복사하여 추가
1
2
3
|
>>> 복사본.loc['철민'] = .loc['철수']
>>> 복사본
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
영민 | 3 | 남자 | 90 | 80.0 | 90.0 | 62.0 |
민정 | 2 | 여자 | 81 | 72.0 | 84.0 | 90.0 |
철민 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
'철수'행과 같은 내옹으로 '철민'행이 추가됨.
D) 다른 데이터 프레임과 병합
- 제외된 열에 대해서는 NaN(결측치)로 설정됨.
1
2
3
|
>>> tmp = DataFrame({'국어': 81, '수학': 84, '과학': 90}, index=["상호"])
>>> tmp
|
cs |
- A.append(B)는 A에 B를 덧붙인다는 의미.
이 경우 컬럼의 쌍이 맞지 않아도 병합이 가능하며, 존재하지 않는 컬럼은 NaN으로 저장
1
2
3
|
>>> 추가본 = 복사본.append(tmp)
>>> 복사본
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
호영 | 4.0 | 남자 | 120 | 50.0 | NaN | 88.0 |
철수 | 1.0 | 남자 | 98 | NaN | 88.0 | 64.0 |
영희 | 2.0 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
수현 | 3.0 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
민수 | 1.0 | 남자 | 92 | 70.0 | NaN | NaN |
영민 | 3.0 | 남자 | 90 | 80.0 | 90.0 | 62.0 |
민정 | 2.0 | 여자 | 81 | 72.0 | 84.0 | 90.0 |
철민 | 1.0 | 남자 | 98 | NaN | 88.0 | 64.0 |
상호 | NaN | NaN | 81 | NaN | 84.0 | 90.0 |
2) 열 추가
A) 데이터 프레임 복사
1
2
3
|
>>> 복사본2 = 성적표.copy()
>>> 복사본2
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
B) 리스트를 활용한 열 추가
- 리스트 형식으로 추가할 경우 행의 수에 맞게 추가해야 한다.
1
2
3
|
>>> 복사본2['한국사'] = [92, 83, 72, None, 80]
>>> 복사본2
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | 한국사 | 세계사 | |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 | 92.0 | 100 |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 | 83.0 | 100 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 | 72.0 | 100 |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 | NaN | 100 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN | 80.0 | 100 |
C) Serise를 통한 열 추가
- 각 값이 연결될 행의 이름(index)를 지정해야 한다. 부분적으로 값을 비워둘 수 있다.
1
2
3
|
>>> 복사본2['사회'] = Series([82, 90, 92, 64, 77], index=['철수', '영희', '민철', '수현', '민수'])
>>> 복사본2
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | 한국사 | 세계사 | 사회 | |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 | 92.0 | 100 | NaN |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 | 83.0 | 100 | 82.0 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 | 72.0 | 100 | 90.0 |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 | NaN | 100 | 64.0 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN | 80.0 | 100 | 77.0 |
'호영'은 index로 지정하지 않아 사회점수가 추가 되지않았고
'민철'은 원본 index에 없기 때문에 추가 되지 않았다.
D) 조건에 따른 선택적인 값을 추가
- 조건에 참인경우 A, 그렇지 않은경우 B
1
2
3
|
>>> 복사본2['국어결과'] = numpy.where(복사본2['국어'] >= 70, '합격', '불합격')
>>> 복사본2
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | 한국사 | 세계사 | 사회 | 국어결과 | |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 | 92.0 | 100 | NaN | 합격 |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 | 83.0 | 100 | 82.0 | 합격 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 | 72.0 | 100 | 90.0 | 합격 |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 | NaN | 100 | 64.0 | 불합격 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN | 80.0 | 100 | 77.0 | 합격 |
'수현'의 사회점수가 70점이 안되므로 '불합격' 출력
E) 여러개의 조건중에서 선택적인 값을 추가하기
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 학점을 부여하기 위한 점수의 구간을 설정하는 조건들을 리스트로 설정
conditions = [ (복사본2['영어'] >= 90), # A
(복사본2['영어'] >= 80), # B
(복사본2['영어'] >= 70), # C
(복사본2['영어'] < 70), # F
(numpy.isnan(복사본2['영어']) == True)] # 빈값(NaN)인 경우 F
# 조건에 따라 부여될 학점
grade = [ 'A', 'B', 'C', 'F', 'F' ]
# 조건에 따른 학점열 추가하기
복사본2['영어학점'] = numpy.select(conditions, grade)
복사본2
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | 한국사 | 세계사 | 사회 | 국어결과 | 영어학점 | |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 | 92.0 | 100 | NaN | 합격 | F |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 | 83.0 | 100 | 82.0 | 합격 | F |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 | 72.0 | 100 | 90.0 | 합격 | A |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 | NaN | 100 | 64.0 | 불합격 | F |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN | 80.0 | 100 | 77.0 | 합격 | C |
'Python' 카테고리의 다른 글
python(지도 시각화) (0) | 2020.05.21 |
---|---|
Python (데이터 전처리 - 행/열 삭제 및 병합) (0) | 2020.05.15 |
Python (데이터 전처리 - 행/열 순서 및 이름 변경, 데이터 정렬) (1) | 2020.05.14 |
Python(DataFrame) (0) | 2020.05.14 |
Python ( pandas ) (0) | 2020.05.14 |
댓글