본문 바로가기
Python

Python (데이터 전처리 - 데이터검색, 행/열 추가)

by 글로리. 2020. 5. 15.

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 = [9888]
 
>>> print(item)
[9888]
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'남자'90809062]
 
>>> 복사본
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['한국사'= [928372, 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([8290926477], 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

댓글