반응형
Notice
Recent Posts
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Today
Total
관리 메뉴

H-Log

[python] pandas 데이터 선택 본문

dev-log/python

[python] pandas 데이터 선택

hong6v6 2023. 1. 17. 18:31
반응형

출처 : 나도코딩 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

 

반응형
Comments