https://youtu.be/meEchvkdB1U?feature=shared

 

Term :단어

단어의 문서 연관성: 각 단어별로 이 문서에 대한 정보를 얼마나 가지고 있냐. 단어와 이 문서간이 연관성을 나타낸다.

 

TF-IDF : Term Frequency * Inverse Document Frequency

왜 TF-IDF ?

문서 내에서 가장 관련된 단어를 찾기 위해.

가설 : 단어의 관련성은 이 문서 내에서 가장 많이 등장했으면 이 단어가 이 문서에 관련성이 크다고 판단.

 

TF?

TF는 문서 내에서 단어가 얼마나 발생하는지 측정한 것이다. 

만약 이 문서 내에서 단어가 다른 단어보다 더 많이 등장한다면, 이 단어는 다른 단어보다도 이 문서와의 관련성이 크다고 가정한다. 

a new car, used car, car review

word TF
a 1/7
new 1/7
car 3/7
used 1/7
review 1/7

 

a friend in need is a friend indeed

word TF
a 2/8
friend 2/8
in 1/8
need 1/8
is 1/8
indeed 1/8

'a'는 이 문서에서 가장 빈번히 발생한 단어이다. 하지만 이 문서와는 연관성이 적다. 

이런 한계를 개선하기 위해 IDF를 활용한다. (어느 문장에서나 자주 출현하는 단어 불용어 같은)

 

IDF?

Inverse document frequency

어느 문장에서나 자주 출현하는 단어에 대한 패널티를 주기 위해서 IDF 를 사용.

Log (Total # of Docs / # of Docs with the term in it)

Log (Total # of Docs / # of Docs with the term in it + 1) --> 분모가 zero가 되는 것을 피하기 위해 +1을 해준다 (for smoothing)

 

A: a new car, used car, car review

B: a friend in need is a friend indeed

word IDF
a log(2/2) = 0
new log(2/1) = 0.3
car log(2/1) = 0.3
used log(2/1) = 0.3
review log(2/1) = 0.3
friend log(2/1) = 0.3
in log(2/1) = 0.3
need log(2/1) = 0.3
is log(2/1) = 0.3
indeed log(2/1) = 0.3

 

A: "a new car, used car, car review"

B: "a friend in need is a friend indeed"

 

word TF   IDF TF*IDF  
  A B   A B
a 1/7 2/8 log(2/2) = 0 0 0
new 1/7 0 log(2/1) = 0.3 0.04 0
car 3/7 0 log(2/1) = 0.3 0.13 0
used 1/7 0 log(2/1) = 0.3 0.04 0
review 1/7 0 log(2/1) = 0.3 0.04 0
friend 0 2/8 log(2/1) = 0.3 0 0.06
in 0 1/8 log(2/1) = 0.3 0 0.04
need 0 1/8 log(2/1) = 0.3 0 0.04
is 0 1/8 log(2/1) = 0.3 0 0.04
indeed 0 1/8 log(2/1) = 0.3 0 0.04

 

https://youtu.be/4f9XC8HHluE?feature=shared

n-그램 

  • 문장을 n개의 토큰(word, characters..)으로 구성된 연속적인 문장으로 자른 것 

1-gram(unigram)

fine thank you

Word level = [ fine, thank, you]

Character level = [f,i,n,e,t,h,a,n,k,y,o,u]

 

2-gram(bigram)

fine thank you

Word level = [fine thank, thank you]

Character level = [fi, in, ne, e , t, th, ha, an, nk, k, y, yo, ou] (공백 포함)

 

3-gram(trigram)

fine thank you

word level = [fine thank you]

Character lebel = [fin, ine, ne , e t, tha, han, ank, nk , k y, yo, you]

 

n-gram을 사용하는 이유

  • bag of words의 단어의 순서를 무시하는 단점을 극복할 수 있다. 
  • 다음 단어 예측을 할 수 있다.
  • 스펠링이 잘못된 걸 찾을 수 있다.

Bag of words' drawbacks

  • machine learning is fun and is not boring
    • machine learning이 한 단어인지 모른다. 
    • not이 fun이 not 하다는 건지 boring이 not 하는 건지 알지 못한다
    • machine learning is boring and is not fun과 동일한 벡터를 가진다.

Bag of bigram

  • not boring 을 토큰으로 구분할 수 있다 
machine learning is fun fun and and is is not not boring
1 1 1 1 1 1

 

Naive next word prediction

Trigram Count
how are you 2
are you doing 1
how are they 1

 

Naive spell checker

  • quality
  • quater
  • quit

qwal 일때 qu 에서 3인것을 보고 spell checking을 할 수 있다 

Bigram Count
qu 3
ua 2
li 1

 

https://youtu.be/dKYFfUtij_U?feature=shared

 

Bag of words

한 문장 안에 들어있는 단어의 빈도수를 기반으로 표현한 행렬, 문장을 수치로 변형한 값

 

"Awesome thank you!" 를 BoW로 표현하면 아래와 같다. 

Awesome  thank  you  great  not  bad  good
1 1 1 0 0 0  

 

Bag of Words 의 Sentence similarity

  • awesome thank you [1,1,1,0,0,0,0]
  • great thank you [0,1,1,1,0,0,0]

==> 두 문장 간의 유사도 = 각 행렬을 곱한 것을 더한 값 = 1+1 = 2

 

Limitation

  • Sparsity : 각 문장 단어별로 한 열을 차지 하기 때문에 zeros 가 많을 수 있다. 벡터의 차원이 100만개가 될 수 있다. 무수히 많은 0으로 인해 계산량이 높아지고, 메모리도 상당히 많이 차지한다.
  • Frequent words has more power : 많이 등장한 단어에 대한 힘이 세진다. (단어의 의미를 중시하지 않고, 빈도수 기반이기 때문)
  • Ignoring word orders : 단어 순서가 무시된다. home run vs run home 은 다른 의미의 문장이지만, 단어 빈도수 기반이기 때문에 문장 순서는 무시된다.
  • Out of vocabulary : 스펠링이 잘못된 경우, unseen words를 핸들링 할수 없다. 

참고

과정이 세세히 적혀있고 생각했던 풀이의 연장선이라 감사히 참고하였다. 

https://velog.io/@syhan28/2022-KAKAO-%EA%B3%B5%EC%B1%84-%EC%8B%A0%EA%B3%A0-%EA%B2%B0%EA%B3%BC-%EB%B0%9B%EA%B8%B0%ED%8C%8C%EC%9D%B4%EC%8D%AC

문제

https://programmers.co.kr/learn/courses/30/lessons/92334

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

소스코드

from collections import defaultdict

def solution(id_list, report, k):
	answer = [0]*len(id_list)
    
    report = set(report)
    
    user_id_who_i_report = defaultdict(set) # value 형태가 set
    num_of_reported = defaultdict(int) # value 형태가 int
    suspended = [] # k 이상인 id
    
    for r in report:
    	do_report, be_reported = r.split()
        
        num_of_reported[be_reported] += 1
        user_id_who_i_report[do_report].add(be_reported) # dict에 value 값 추가
        
        if num_of_reported[be_reported] == k:
        	suspended.append(be_reported)
	
    for s in suspended:
    	for i in range(len(id_list)):
        	if s in user_id_who_i_report[id_list[i]]:
            	anwer[i] += 1
	
    return answer

풀이

Dictionary, defaultdict 

dictionary 자료구조를 사용해야 겠다는 생각은 했다. dictionary 2개를 이용해서 유저별 신고한 유저 정보를 담은 사전 1개, 유저별 나를 신고한 사람 정보를 사전 1개. 

 

하지만 값이 들어가 있지 않은 dictionary는 어떻게 정의해야 할지 몰랐고, 주어지는 값들을 원하는 형태로 만드는 법도 몰랐다. dictionary에 대한 개념 부족 + defaultdict 개념을 몰랐기 때문이다. 

 

보통 dictionary를 사용하는 문제에서는 defaultdict를 사용한다고 한다. collection 라이브러리에서 defaultdict를 import 한다. 알아두자 알아두자. 

 

from collections import defaultdict

그래서 사용할 2개의 dictionary를 key:value 형태로 다시 정리하자면

  • 신고를 행한 유저 A (string) : 유저 A가 신고한 유저 목록 (set) --> dictionary 명: user_list_who_i_report
  • 신고를 당한 유저 A (string) : 유저 A를 신고한 유저 수 (int) --> dictionary 명: num_of_reported 

사실 처음에는 "유저 A를 신고한 유저"를 int형으로 나타낼 생각을 하지 못했다. 이것 또한 string 형태로 넣으려고 했지. 문제에서 구하라는 형태대로 값을 바로 생성하도록 하자. 

 

문제조건 및 제한사항

각 유저는 한 번에 한 명의 유저를 신고할 수 있다. 한 유저가 여러 번 신고할 수도 있지만 동일한 유저에 대한 신고 횟수는 1회로 처리된다는 것이다. 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report 을 set( ) 으로 묶어 중복값 제거가 필요했다. 

 

k번 이상 신고된 유저는 게시판 이용이 정지된다. 그러면.. k번 이상 신고당한 유저의 목록을 따로 만들어 주어야 한다. 이 리스트를 만들 생각도 못 했는데... 알고리즘 문제를 풀면서의 중간 과정을 변수나 배열 형태로 저장해야 한다는 거를 꼭 기억해서 실천해야 겠다.

참고한 자료에서는 suspended 라는 리스트를 만들어줬다. 

 

그리고 해당 유저를 신고한 모든 유저들에게 정지 사실을 메일로 발송한다. 그 때 각 유저별로 받은 결과 메일 수를 담고 리턴한다. 메일 수를 담은 리스트는 id_list에 기입된 ID와 동일한 순서로 리턴해야 한다. 

이를 위해 id_list의 len만큼 answer 배열을 [0, 0, 0, 0] 형태로 초기화시켰다. 

 

해결

주어진 리스트 report에 들어 있는 값은 "신고하는 사람 신고당하는 사람" 형태로 되어 있다. 각 데이터를 split() 함수를 이용하여 공백을 기준으로 나눠주고, 신고한 사람을 do_report로, 신고당한 사람을 be_reported로 정의하여 값을 얻는다. 

이 상태에서 반복문 및 조건문을 이용하여 위에 정의한 두 딕셔너리를 채워주고, 채움과 동시에 k번 이상 신고당해 게시판 이용이 정지된 유저도 걸러낼 수 있었다. 

num_of_reported 사전에 유저 별 신고당한 횟수를 기록할 때, 신고당해서 1을 더하여 k가 된다면 몇 번 더 신고당하던지 정지 대상자이므로 suspended에 담아주면 된다.

마지막으로 각 유저들이 신고한 내용(사람)이 담겨있는 딕셔너리(user_list_who_i_report)와 id_list를 이용하여 suspended에 속한 유저들이 user_list_who_i_report[id_list[i]]에 포함되어 있다면 answer에서 해당되는 자리 (반복문 & 인덱스 접근이므로 순서가 자연히 맞는다)의 수를 1 증가시키는 것으로 이 문제를 해결할 수 있다. 

배운점

중간 과정에서 임시로 필요한 공간은 변수나 배열 형태로 저장할 수 있다는 거 기억하고 잘 써먹자.

dict를 defaultdict(value type) 으로 정의할 수 있으며, add를 통해 value 값을 추가할 수 있다는 거 기억하자.

최종적으로 구해야 하는 값에 초점을 맞춰서 불필요한 건 제거하고 최소한의 계산을 할 수 있도록 하자 

 

숫자가 그림이 되는 순간 어렵고 멀게만 느껴지 데이터가 한눈에 쏙 들어오고, 오래오래 머릿속에 남는 마법을 경험했습니다. 엑셀과 경직된 PPT로 보던 숫자들이 다양한 모습으로 변신하는 것을 본 이후로는, 모든 숫자가 양질의 정보가 되어 전달되기 위해서는 무엇보다 시각화가 중요하다는 것을 느꼈습니다. 보기 좋은 떡이 먹기도 좋다는 속담처럼, 숫자도 어떤 그릇에 어떻게 담느냐에 따라 전해지는 정보의 질은 달라진다고 믿습니다. 

 

책 데이터 시각화 분석 태블로로 끝내기를 읽다 가져온 글입니다. 

 

 

 

https://smlee729.github.io/python/data%20structure/2015/03/02/1-list-allocation.html

 

Python의 List 구조 성능분석 | Jacob's Coding Playground

문득 코딩을 하다가, 꽤나 큰 시간차가 발생되게 하는 원인이 list에 관련된 함수들 때문이라는 것을 알고, 이것에 대한 분석을 해야겠다는 생각이 들었습니다. 물론 다행히도 심각한 성능의 결

smlee729.github.io

백준 문제 10989번 문제를 풀다가 파이썬의 append로는 메모리 제한이 걸린다는 점, 더 나아가 Python의 list 에 관련된 함수들이 시간이나 공간복잡도를 높히는데 한 몫 한다는 걸 알게 되었다. 

 

그래서 여럿 블로그를 보다가 위의 블로그를 발견하여 간단하게 내용 정리하였다.

 

append( ) 함수

append라는 함수 자체가 기존에 할당된 공간을 확장해서 사용하는 거라고 한다. 만약에 연속된 메모리의 자리가 없을 경우 새롭게 큰 공간을 만들어 모든 값들을 이사시켜야 하는 단점이 있다. 여기서 꽤나 큰 overhead가 발생하게 되서 상대적으로 느립니다. 

 

그니깐 append 를 함수 사용할 떄마다 그 때 필요한 메모리 공간을 재생성한다고 한다. 공간이 재생성되면서 기존 공간에 있던 값들이 이동을 해야 해서 시간도 걸리고 공간 활용도도 떨어진다. 

 

이를 해결하기 위해? 

첫번째 방법, 

미리 큰 공간을 만들어놓는 방법을 사용한다. 미리 N개의 공간을 만들어 놓고, 값만 바꿔주는 식으로 진행한다. 이 방법으로는 1.5배 정도까지 시간을 줄여준다고 한다. 

 

두번째 방법,

내장된 함수를 사용하는 방법이다. range( ) 라는 함수를 사용한다는 것! 내장 함수(Built-in 함수)들은 C언어로 최적화 되어있기 때문에, 굉장히 빠른 속도를 자랑한다고 한다. (좋은데?) 

 

구체적으로 append 의 동적배열에 대한 내용은 아래 블로그를 참고한다. 

https://hs11.tistory.com/2

 

1. 선형자료구조 - 동적배열(Dynamic Array)

동적배열은 선형 자료 구조에서 연결 리스트와 함께 다른 자료구조를 구현하는데 필요한 기초적인 도구이다. 기본적으로 대다수의 언어에서 표준 라이브러리에 포함 되어 있다. 동적배열은 내

hs11.tistory.com

추가적인 유의사항들도 아래 블로그를 참고한다. 나도 나만의 꿀팁? 같은 걸 블로그에 적는 연습을 좀 해야겠다. 

https://planjang.tistory.com/230

 

파이썬 메모리 이모저모 - 프로그라피 알고리즘 스터디 개인 발표 자료

변수 특정 메모리 주소를 담음, 메모리 주소에 붙이는 라벨 id함수 해당 객체/변수의 메모리 주소 값을 반환 C/C++의 & 포인터 연산자와 동일 is 와 == 의 차이점 >>> a = 1000 >>> b = 1000 >>> a is b False >>>..

planjang.tistory.com

 

vscode에서는 인터프리터와 컴파일러가 다 되는걸까? 

 

shift + enter를 누르면 해당 줄만 실행이 되고 (한줄 한줄 실행이 된다)

 

ctrl + f5를 하면 전체 파일이 한번에 실행된다. 

 

찾아보니, ctrl + f5 는 디버깅하지 않고 실행하는 것 (즉, 빨간 점은 무시하고 그냥 실행된다)

 

이건 좀 차근 차근 알아봐야 겠다

vscode에서 디버거 하는 법 !

 

그리고 shift + enter를 통해 인터프리터 모드를 지원하는 듯 하다.

 

참고하기

https://docs.microsoft.com/ko-kr/visualstudio/debugger/navigating-through-code-with-the-debugger?view=vs-2022 

 

디버거를 사용하여 코드 탐색 - Visual Studio (Windows)

Visual Studio 디버거를 사용하여 코드 문제를 해결하는 방법을 알아봅니다. 항목에는 중단 모드 적용, 단계별 코드 실행, 대상까지 실행이 포함됩니다.

docs.microsoft.com

 

문제가 생기면 생각하지 않고 그저 블로그에 나온 내용들 찾고 트라이 해보려니 해결이 잘 안되는 것 같다. 

 

왜 그렇게 해결하는지 생각하고 실행해야 할 듯 ㅎㅎ

 

우선 내가 겪은 문제는 '가상환경' 설정과 관련된 문제였다. 

 

처음에는 이게 가상환경과 관련된 문제인지도 몰랐지만 ㅋㅋ

아래 블로그를 참고해서 많은 도움을 받았다. 

https://lapina.tistory.com/3?category=758039 

 

[파이썬] 파이썬 개발환경 구축 완료(?)

[파이썬] 파이썬 개발환경 구축 중 1. 한참동안 놓고있던 파이썬을 다시 해보려고 컴퓨터를 켰다. Anaconda 가 설치 되어있었고, Atom으로 web 공부를 하고있었으며, AWS를 이용해 RDB 를 공부하고 있었

lapina.tistory.com

 

 

암튼 문제는

'conda command not found' 라는 에러가 계속 발생하는 문제였다. 

언제 했는지는 모르겠지만 vscode에서 anaconda에서 설정한 가상환경을 사용하고 있었고, 

왜인지 conda 키워드는 사용할 수 없었다. 

 

찾아 보니 아래 블로그를 통해 환경변수를 추가하지 않았음을 알게 되었다. 

https://velog.io/@dudu/conda-command-not-found-%ED%95%B4%EA%B2%B0

 

conda command not found 해결

설치할 때 환경변수 추가할까요? 가 Not recommand라 제대로 보지도 않고 그냥 넘겼는데 이런 문제가....

velog.io

그럼 또 궁금해졌다..  환경변수는 무엇이고 왜 설정해야 하는지? 

 

환경변수 설정을 통해 변수값에 경로를 미리 세팅해서 언제든 가져다 쓸 수 있게 하는 걸 의미했다. 

현재 위치에서 conda라는 키워드를 입력할 파일(?)이 없다보니 command not found가 된 것

 

그래서 위 블로그를 통해 condabin 의 path를 추가해주었다. 

https://velog.io/@psj0810/%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98%EB%9E%80

 

환경변수란?

PATH란?경로이다. 프로그램이 실행되는 방법을 알아야한다.윈도우에서는 파일을 찾을때 가장 먼저 찾는곳이 현재 디렉토리이다.터미널을 열면 가장먼저 있는 장소가 현재디렉토리이다.cmd창에서

velog.io

 

그렇게 하고 vscode를 끄고 다시 열고나니 conda --version이 실행되었다 어디에서? 

Python select interpreter에서 ('base':conda)를 선택하고 나서...!

 

실제로 python 기본 interpreter로 'import numpy'를 하니 안되었당 

기본 python에는 numpy 라이브러리가 없으니 import 자체가 안된것!

그래서 코테에서는 import math를 쓰시나 보다 싶었다. 

파이썬 자체 내장 라이브러리(파이썬 표준 라이브러리) 였다 !!!

 

이 사실 알기 전에는 vscode에서는 conda 보다는 python으로만 작업하고 싶은데,, 그렇게 할 수 있는 방법은 없나? 하는 생각이 들었고, 찾아보니 있다 ! 가상 환경을 달리 설정해주면 될 것. 

 

아나콘다를 설치하면서 같이 설치된 numpy나 panda를 사용하고자 하면 interpreter를 anaconda에서 만든 가상환경을 설정해주면 되고 

(현재 가상환경이 어디로 설정이 되었는지는 왼쪽 하단에 보면 알수 있다/ 파란 줄 왼쪽에서('base': conda)라는 걸 알수 있다)

현재 어떤 가상 환경에서 작동되고 있는지 확인하기 위해서는 왼쪽 하단을 보자

 

python 기본 을 사용하고 싶다면 interpreter를 python 기본으로 내 경우에는 (Python 3.8.6 64-bit) 로 설정하면 된다. 

Python select interpreter  =  Ctrl + shift + p 

 

환경변수 설정과 가상환경, 그리고 내장 라이브러리까지.. 

이미 알아야 했지만 알지못했던 것들 기본적인 것들을 깨닫게 되었다.

 

'PYTHON' 카테고리의 다른 글

파이썬의 공간복잡도과 시간복잡도  (0) 2022.01.04
인터프리터와 컴파일러  (0) 2021.12.28

데이터 프레임 : 행과 열로 구성된 2차원 데이터 구조

 

DataFrame 에서 열 또는 행을 선택하는 방법은 다음과 같다.

  1. 컬럼명 또는 행의 index를 사용하는 방법 > DataFrame.loc[] 사용 > DataFrame.loc[ 행, 열 ]
  2. 열 또는 행의 순서(위치) 사용하는 방법 > DataFrame.iloc[] 사용 . DataFrame.iloc[ 행, 열 ]

 

DataFrame.loc 사용하기

loc 이용해서 필요한 열 추출하기

[ ] 안의 앞에는 전체를 의미하는 " : " 를, 뒷자리에는 선택할 열 이름으로 구성된 list를 넣어주면 된다.

이는 모든 행(:)의 선택한 열만 보겠다는 의미

df = df.loc[: , ['성별코드', '신장', '체중']]

df = df[['성별코드', '신장', '체중']]

 

loc 이용해서 필요한 행 추출하기

df에서 index가 1, 5, 10, 20 인 값을 추출해 df_2에 저장해보았다.

열 선택할 때와 동일한 방법이지만, 이번에는 [ ] 안의 행 자리에 선택할 행의 index list를 넣어주고, 열 자리에는 " : "을 입력합니다.

df _2 = df.loc[[1, 5, 10, 20], :]

 

loc 이용해서 필요한 열과 행 동시에 선택하기

열 선택하는 방법과 행 선택하는 방법을 같이 사용한다.

df_2 = df.loc[[1, 5, 10, 20], ['성별코드', '신장', '체중']]

 

DataFrame.iloc 사용하기

iloc 이용해서 필요한 열 추출하기

iloc는 위치(순서)로 검색한다. 각 열의 순서를 먼저 확인해야 합니다.

'성별코드'는 2번째 칼럼이므로 1, '신장'은 5번째 컬럼이므로 4.. 이런식으로 지정하면 우리가 선택해야 할 열의 순서(위치)는 [1,4,5,6]이 됩니다.

df_2 = df.iloc[: , [1, 4, 5, 6]]

 

연속된 열을 선택할 경우, ":"을 사용하면 됩니다. 각 열의 위치를 담고 있는 List가 아니라, 필요한 열의 처음과 끝 위치를 지정해주는 것이다.

df_2  = df.iloc[: , 0:5]

 

iloc 이용해서 필요한 행 추출하기

[ ] 안에 선택할 행의 순서가 담긴 list를 넣어줍니다.

df_2  = df.iloc[[1, 5, 10, 20], :]

 

연속된 열을 선택하는 방식과 동일하게 연속된 행도 선택 가능합니다.

df_2 = df.iloc[4:10, :]

 

iloc 이용해서 필요한 열과 행 선택하기

연속된 행과 열을 선택할 경우에는 다음과 같이 사용하면 된다.

df_2 = df.iloc[-6:-1, 1:3]

 

행과 열을 리스트로 지정해서 사용할 수도 있다.

df_2 = df.iloc[[0,10,20,30,40],[1,3]]

 

컬럼 조건문으로 행 추출하기

df에서 '성별코드' 열의 값이 '1'인 행만 추출해 보겠습니다. 방법은 조건을 [] 안에 넣어주면 됩니다.

df_2 = df[df['성별코드'] == 1]

 

경우에 따라 위의 예제와 달리 조건문에서 선택해야 할 값이 다수일 때가 있다. 이럴 땐 당화하지 말고 Series 객체의 'isin()' 메소드를 사용하면 됩니다.

df_2 = df[df['신장'].isin([165, 155, 150])]

 

이번에도 조건문이 여러 개인 경우입니다. 앞의 두 예시는 조건문이 하나였지만, 여러 개의 조건문이 동시에 사용되는 케이스도 매우 흔한 편입니다.

 

이 경우에도 방법은 간단합니다. 그냥 본인이 원하는 결과가 나오도록 조건문을 비트 연산자(Bitwise operator)로 연결하면 됩니다.

 

아래 예시는 신장이 170(이상) ~ 180(미만) 사이의 사람만 추출하는 코드입니다.

df_2 = df_2[(df_2['신장'] >= 170) & (df_2['신장']) < 180 ]

 

조건문이 너무 복잡하거나 길어지면 아래 방식으로도 설정할 수 있습니다.

condition1 = (df_sample['신장'] >= 170) & (df_sample['신장'] < 180)
condition2 = (df_sample['체중'] >= 65) & (df_sample['체중'] < 80)
sample_13 = df_sample[condition1 & condition2]

 

참고 : 

https://m.blog.naver.com/rising_n_falling/221622971970

+ Recent posts