오식랜드
[python] pandas 데이터 선택 본문
출처 : 나도코딩 https://www.youtube.com/watch?v=PjhlUzp_cU0&t=10533
import pandas as pd
# excel 파일 열기
df = pd.read_excel('score.xlsx', index_col='지원번호')
Column 선택 (label)
- column 하나만 선택
print(df['이름'])
지원번호
1번 채치수
2번 정대만
3번 송태섭
4번 서태웅
5번 강백호
6번 변덕규
7번 황태산
8번 윤대협
Name: 이름, dtype: object
print(df['키'])
지원번호
1번 197
2번 184
3번 168
4번 187
5번 188
6번 202
7번 188
8번 190
Name: 키, dtype: int64
- column 여러개 선택
print(df[['이름','키', '학교']])
이름 키 학교
지원번호
1번 채치수 197 북산고
2번 정대만 184 북산고
3번 송태섭 168 북산고
4번 서태웅 187 북산고
5번 강백호 188 북산고
6번 변덕규 202 능남고
7번 황태산 188 능남고
8번 윤대협 190 능남고
- 정수 index로 불러오기
이 기능을 통해서 우리는 column의 이름을 모르더라도 정수를 통해 불러올 수 있다
먼저 colums로 원하는 column이 몇번째인지 확인한다
순서는 0부터 시작한다
print(df.columns)
Index(['이름', '학교', '키', '국어', '영어', '수학', '과학', '사회',
'SW특기'], dtype='object')
원하는 index 숫자를 대괄호[] 안에 넣어서 정확히 출력 되는지 확인!
print(df.columns[0])
# 이름
column 출력에 사용
df[’이름’]과 동일한 기능 사용 가능
print(df[df.columns[0]]) # = df['이름']
- 맨 마지막(맨 오른쪽)의 column 불러오기
#맨 마지막 column 불러오기
print(df[df.columns[-1]])
슬라이싱
문자열을 자르던 [n:n] 문법으로 데이터를 슬라이싱 할 수 있다
영어 성적을 앞에서부터 5개만 가져와보자
print(df['영어'][:5])
지원번호
1번 85
2번 35
3번 75
4번 60
5번 20
전체 데이터 중 몇개만 가져와보자
print(df[3:])
이름 학교 키 국어 영어 수학 과학 사회 SW특기
지원번호
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
데이터선택 (loc)
이름을 이용해서 원하는 row에서 원하는 col 선택
- row 불러오기
print(df.loc['1번'])
이름 채치수
학교 북산고
키 197
국어 90
영어 85
수학 100
과학 95
사회 85
SW특기 Python
Name: 1번, dtype: object
- row에서 원하는 col 선택
print(df.loc['1번', '국어']) # 1번 index의 '국어'컬럼에 해당하는 값 출력
# 90
- 여러개의 row에서 col값 선택
- : row를 대괄호[]로 묶어준다 (=list로 입력해준다)
print(df.loc[['1번', '2번'], '영어'])
지원번호
1번 85
2번 35
- 여러개의 row에서 여러개의 col값 선택
- : row와 col을 대괄호[]로 묶어준다 (=list로 입력해준다)
print(df.loc[['1번', '2번'], ['영어', '수학']])
지원번호
1번 85 100
2번 35 50
- row와 col을 범위로 지정하기
여기에서는 범위를 대괄호[]로 묶어주지 않는다!
print(df.loc['1번':'5번', '국어':'사회'])
국어 영어 수학 과학 사회
지원번호
1번 90 85 100 95 85
2번 40 35 50 55 25
3번 80 75 70 80 75
4번 40 60 70 75 80
5번 15 20 10 35 10
데이터선택 (iloc)
위치(정수 index)를 이용해서 원하는 row에서 원하는 col 선택
loc과 문법은 모두 같음
- row 불러오기
print(df.iloc[0])
Name: 1번, dtype: object
이름 학교 키 국어 영어 수학 과학 사회 SW특기
- 데이터 슬라이싱
print(df.iloc[0:5])
이름 학교 키 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
- row에서 원하는 col 선택
print(df.iloc[0, 1])
- 여러개의 row에서 col값 선택
- : row를 대괄호[]로 묶어준다 (=list로 입력해준다)
print(df.iloc[[0, 1], 4])
지원번호
1번 85
2번 35
Name: 영어, dtype: int64
- 여러개의 row에서 여러개의 col값 선택
- : row와 col을 대괄호[]로 묶어준다 (=list로 입력해준다)
print(df.iloc[[0, 1], [4, 5]])
영어 수학
지원번호
1번 85 100
2번 35 50
- row와 col을 범위로 지정하기
여기에서는 범위를 대괄호[]로 묶어주지 않는다!
print(df.iloc[:3, 4:8])
영어 수학 과학 사회
지원번호
1번 85 100 95 85
2번 35 50 55 25
3번 75 70 80 75
데이터 선택
조건에 맞는 데이터를 선택할 수 있다.
- ‘키’가 185 이상의 데이터 출력
print(df['키'] >= 185
지원번호
1번 True
2번 False
3번 False
4번 True
5번 True
6번 True
7번 True
8번 True
Name: 키, dtype: bool
위와 같이 True / False로 출력된다
- filter를 만들어서 사용하기
# filter는 python 내장함수라 filt라 작명
filt= (df['키'] >= 185 )
print(df[filt])
이름 학교 키 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
- filter의 역으로 조건걸기
# filter는 python 내장함수라 filt라 작명
filt = (df['키'] >= 185 )
#역으로 적용
print(df[~filt])
이름 학교 키 국어 영어 수학 과학 사회 SW특기
지원번호
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
- 필터링한 row의 col 출력하기 : loc 사용
키 185이상의 데이터의 ‘수학’점수만 불러오기
filt = (df['키'] >= 185 )
df.loc[filt, '수학']
지원번호
1번 100
4번 70
5번 10
6번 95
7번 45
8번 90
Name: 수학, dtype: int64
키 185 이상의 데이터의 ‘이름’, ‘수학’, ‘ 과학’ 점수만 불러오기
print(df.loc[filt, ['이름', '수학', '과학']])
이름 수학 과학
지원번호
1번 채치수 100 95
4번 서태웅 70 75
5번 강백호 10 35
6번 변덕규 95 85
7번 황태산 45 40
8번 윤대협 90 95
다양한 조건
& 그리고
학교는 북산고 + 키 185 이상
filt = ( df['키'] >= 185) & (df['학교'] == '북산고')
print(df.loc[filt])
이름 학교 키 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
또는
키가 170 미만이거나 200 보다 큰 데이터
filt = ( df['키'] < 170) | (df['키'] > 200)
print(df.loc[filt])
이름 학교 키 국어 영어 수학 과학 사회 SW특기
지원번호
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
6번 변덕규 능남고 202 80 100 95 85 80 C
str 함수
pandas 공식 문서에서도 확인 가능
https://pandas.pydata.org/docs/user_guide/text.html
시작하는 글자 : str.startswith()
start뒤에 s가 있다! 주의하자
- 성씨가 ‘송’인 사람
filt = df['이름'].str.startswith('송')
print(df[filt])
이름 학교 키 국어 영어 수학 과학 사회 SW특기
지원번호
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
글자 포함 여부 : str.contains()
- 이름에 ‘태’가 들어가는 사람
filt = df['이름'].str.contains('태')
print(df[filt])
이름 학교 키 국어 영어 수학 과학 사회 SW특기
지원번호
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
- 이름에 ‘태’가 들어가지 않는 사람
filt = df['이름'].str.contains('태')
print(df[~filt])
이름 학교 키 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
8번 윤대협 능남고 190 100 85 90 95 95 C#
데이터 포함 여부
- isin
SW특기가 ‘Python’ 또는 ‘Java’인 경우
langs = ['Python', 'Java']
filt = df['SW특기'].isin(langs)
print(df[filt])
이름 학교 키 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
다만, 이렇게 진행하게 되면 대/소문자 차이로 False가 나올 수 있다
(PYTHON은 결과에 포함되어있지 않음)
- str.lower()
모든 SW특기를 소문자로 바꿔주고 진행하자
langs = ['python', 'java']
filt = df['SW특기'].str.lower().isin(langs)
print(df[filt])
- contains
‘java’라는 글자가 포함되어있으면 True
다만, contains에서는 NaN 데이터가 그대로 출력된다
na = False를 추가해주어 NaN데이터에 대해서 False로 인지하도록 해주자
filt = df['SW특기'].str.contains('Java', na=False)
print(df[filt])
이름 학교 키 국어 영어 수학 과학 사회 SW특기
지원번호
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
'dev-log > python' 카테고리의 다른 글
[python] pandas 데이터 정렬 (0) | 2023.01.17 |
---|---|
[python] pandas 결측치(비어있는 데이터) 처리 (0) | 2023.01.17 |
[python] pandas 데이터 확인 (0) | 2023.01.17 |
[python] pandas 파일 저장 및 열기 (0) | 2023.01.17 |
[python] pandas 시작하기 (0) | 2023.01.17 |