아이티윌_데이터 분석 55기/강의내용 필기_Python

#3 3일차_조건문, 반복문

ecosso 2026. 5. 13. 16:18

01 조건문

 -01 if문

 -02 np.where

 

02 반복문

 -01 for문

 -02 while문

 

03 반복문 심화

 -01 여러 대상에 대한 반복처리

 -02 중첩 반복문


01 조건문

 -01 if문

하나의 상수에 대한 조건 처리가 가능하다.

 

if 조건 : 

   참일 때 명령어

else :

   거짓일 때 명령어

 

마지막 포지션 구분기호는 정해져있지 않다.

엔터로 빈 줄을 입력하면 코드의 끝을 선언한다.

 

만약 조건 내에 조건이 추가적으로 포함된다면 코드는 다음과 같다.

 

if 조건1 : 

   조건1이 참일 때 명령어

elif 조건2 :

   조건1이 거짓이면서 조건2가 참일 때 명령어

else : 

   모두 거짓일 때 명령어


ex) 10보다 크면 A, 작거나 같으면 B 리턴

a1 = 15
s1 = Series([1,10,15,3,25])

if a1 > 10 :   
    print('A') 
else : 
    print('B')

if a1 > 10 : 
    print('A') 
else : 
    print('B')
A


if s1 > 10 :   # 불가
    print('A')
else :
    print('B')

if s1 > 10 :   # 불가
    print('A')
else :
    print('B')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_6544\759120846.py in ?()
----> 1 if s1 > 10 :   # 불가
      2     print('A')
      3 else :
      4     print('B')

~\anaconda3\Lib\site-packages\pandas\core\generic.py in ?(self)
   1578     @final
   1579     def __nonzero__(self) -> NoReturn:
-> 1580         raise ValueError(
   1581             f"The truth value of a {type(self).__name__} is ambiguous. "
   1582             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
   1583         )

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

 -02 np.where

numpy 제공 함수이며 R의 ifelse처럼 여러 대상에 대한 조건 처리가 가능하다. (반복문 없이)

출력 결과는 항상 array로 리턴된다.


ex) 10보다 크면 A, 작거나 같으면 B 리턴
s1 = Series([1,10,15,3,25])
np.where(s1 > 10, 'A', 'B')

np.where(s1 > 10, 'A', 'B')
Out[82]: array(['B', 'B', 'A', 'B', 'A'], dtype='<U1')

 


ex) emp.csv 파일을 이용한 np.where 실습
emp = pd.read_csv('emp.csv')
emp.dtypes


#1) DEPTNO가 10이면 인사부, 20이면 총무부, 그 외면 재무부 출력
np.where(emp['DEPTNO'] == 10, '인사부', np.where(emp['DEPTNO'] == 20, '총무부', '재무부'))

np.where(emp['DEPTNO'] == 10, '인사부', np.where(emp['DEPTNO'] == 20, '총무부', '재무부'))
Out[112]: 
array(['총무부', '재무부', '재무부', '총무부', '재무부', '재무부', '인사부', '총무부', '인사부',
       '재무부', '총무부', '재무부', '총무부', '인사부'], dtype='<U3')

#2) 급여등급 컬럼 생성
# 단, 급여등급은 급여가 3000 이상이면 A, 2000이상 3000 미만이면 B, 2000 미만이면 C
emp['GRADE'] = np.where(emp['SAL'] >= 3000, 'A', np.where(emp['SAL'] >= 2000, 'B', 'C'))

emp
Out[117]: 
    EMPNO   ENAME        JOB     MGR         HIREDATE   SAL    COMM  DEPTNO  \
0    7369   SMITH      CLERK  7902.0  1980-12-17 0:00   800     NaN      20   
1    7499   ALLEN   SALESMAN  7698.0  1981-02-20 0:00  1600   300.0      30   
2    7521    WARD   SALESMAN  7698.0  1982-02-22 0:00  1250   500.0      30   
3    7566   JONES    MANAGER  7839.0  1981-04-02 0:00  2975     NaN      20   
4    7654  MARTIN   SALESMAN  7698.0  1981-09-28 0:00  1250  1400.0      30   
5    7698   BLAKE    MANAGER  7839.0  1981-05-01 0:00  2850     NaN      30   
6    7782   CLARK    MANAGER  7839.0  1981-06-09 0:00  2450     NaN      10   
7    7788   SCOTT    ANALYST  7566.0  1987-04-17 0:00  3000     NaN      20   
8    7839    KING  PRESIDENT     NaN  1981-11-17 0:00  5000     NaN      10   
9    7844  TURNER   SALESMAN  7698.0  1981-09-08 0:00  1500     0.0      30   
10   7876   ADAMS      CLERK  7788.0  1987-05-23 0:00  1100     NaN      20   
11   7900   JAMES      CLERK  7698.0  1981-12-03 0:00   950     NaN      30   
12   7902    FORD    ANALYST  7566.0  1981-12-03 0:00  3000     NaN      20   
13   7934  MILLER      CLERK  7782.0  1982-01-23 0:00  1300     NaN      10   

   GRADE  
0      C  
1      C  
2      C  
3      B  
4      C  
5      B  
6      B  
7      A  
8      A  
9      C  
10     C  
11     C  
12     A  
13     C

02 반복문

 -01 for문

반복횟수 혹은 대상이 정해진 경우의 반복을 처리한다.

 

for 반복변수 in 대상 :

     반복할 문장

 

마지막 포지션 구분기호는 정해져있지 않다.

엔터로 빈 줄을 입력하면 코드의 끝을 선언한다.

 

+) 최적의 매개변수 조합을 찾는 것을 그리드 서치라고 한다.

c에 따른 gamma의 변화 등을 확인해야하다보니 for문이 2번씩 필요한 상황이 생긴다. (중첩 for문)


예) 1~10까지 출력
# sequence와 같은 기능을 하는 range를 사용한다.
# range는 마지막 범위를 세지 않기 때문에 10이 아닌 11을 입력해야 한다.
list(range(1,11))
list(range(1,11,2))

list(range(1,11))
Out[121]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

list(range(1,11,2))
Out[122]: [1, 3, 5, 7, 9]

 

for i in range(1,11) :
    print(i)

for i in range(1,11) :
    print(i)
1
2
3
4
5
6
7
8
9
10

예) 각 리스트의 원소에 100을 더한 값을 리턴
list1 = [1,2,3,4,5]

for i in list1 :
    i + 100
    
result = []
for i in list1 :
    result.append(i + 100)


▲ list의 append는 즉시 반영이기 때문에 result = result.appne(i+100)의 형태로 작성하지 않아도 충분하다.

result
Out[133]: [101, 102, 103, 104, 105]

ex) emp.csv 파일을 이용한 for문 실습

# 1) 입사일에서 입사연도 추출하기
emp['HIREDATE'].split('-')

year = []
for i in emp['HIREDATE'] :
    year.append(i.split('-')[0])

year
Out[141]: 
['1980',
 '1981',
 '1982',
 '1981',
 '1981',
 '1981',
 '1981',
 '1987',
 '1981',
 '1981',
 '1987',
 '1981',
 '1981',
 '1982']

 

# 또는

result = []
for i in emp['HIREDATE'] :
    result.append(int(i[:4]))
result

emp['입사연도'] = result



# 2) 이름을 모두 소문자로 변경

result = []
for i in emp['ENAME'] :
    result.append(i.lower())
    
emp['ENAME'] = result

emp
Out[160]: 
    EMPNO   ENAME        JOB     MGR         HIREDATE   SAL    COMM  DEPTNO  \
0    7369   smith      CLERK  7902.0  1980-12-17 0:00   800     NaN      20   
1    7499   allen   SALESMAN  7698.0  1981-02-20 0:00  1600   300.0      30   
2    7521    ward   SALESMAN  7698.0  1982-02-22 0:00  1250   500.0      30   
3    7566   jones    MANAGER  7839.0  1981-04-02 0:00  2975     NaN      20   
4    7654  martin   SALESMAN  7698.0  1981-09-28 0:00  1250  1400.0      30   
5    7698   blake    MANAGER  7839.0  1981-05-01 0:00  2850     NaN      30   
6    7782   clark    MANAGER  7839.0  1981-06-09 0:00  2450     NaN      10   
7    7788   scott    ANALYST  7566.0  1987-04-17 0:00  3000     NaN      20   
8    7839    king  PRESIDENT     NaN  1981-11-17 0:00  5000     NaN      10   
9    7844  turner   SALESMAN  7698.0  1981-09-08 0:00  1500     0.0      30   
10   7876   adams      CLERK  7788.0  1987-05-23 0:00  1100     NaN      20   
11   7900   james      CLERK  7698.0  1981-12-03 0:00   950     NaN      30   
12   7902    ford    ANALYST  7566.0  1981-12-03 0:00  3000     NaN      20   
13   7934  miller      CLERK  7782.0  1982-01-23 0:00  1300     NaN      10   

   GRADE  입사연도  
0      C  1980  
1      C  1981  
2      C  1982  
3      B  1981  
4      C  1981  
5      B  1981  
6      B  1981  
7      A  1987  
8      A  1981  
9      C  1981  
10     C  1987  
11     C  1981  
12     A  1981  
13     C  1982

 -02 while문

조건에 따라 반복을 처리한다.

초기값, 다음값에 대한 지정이 필요할 수 있다.

 

while 반복변수 :

          반복할 문장

 

마지막 포지션 구분기호는 정해져있지 않다.

엔터로 빈 줄을 입력하면 코드의 끝을 선언한다.


예) 1 ~ 100의 총합 구하기
i = 1 # 초기값 선언
vsum = 0
while i <= 100 :
    vsum = vsum + i    # vsum += 1 (축약형 : 똑같은 변수에 계속해서 더하여 그 결과를 덮어쓸 때 사용)
    i = i + 1                  # i += 1 (축약형 : 똑같은 변수에 계속해서 더하여 그 결과를 덮어쓸 때 사용)
print(vsum)

i = 1 # 초기값 선언
vsum = 0
while i <= 100 :
    vsum = vsum + i    
    i = i + 1
print(vsum)
5050

 


[ 연습문제 for + if ]
1. 부서이름 출력 (10:A, 20:B, 30:C)
emp

dname = []
for i in emp['DEPTNO'] :
    if i == 10 :
        dname.append('A')
    elif i == 20 :
        dname.append('B')
    else :
        dname.append('C')

dname
Out[170]: ['B', 'C', 'C', 'B', 'C', 'C', 'A', 'B', 'A', 'C', 'B', 'C', 'B', 'A']

2. 급여등급 출력 (3000 이상 : A, 2000 이상 : B, 2000 미만 : C)
grade = []
for i in emp['SAL'] :
    if i >= 3000 :
        grade.append('A')
    elif i >= 2000 :
        grade.append('B')
    else :
        grade.append('C')

grade
Out[175]: ['C', 'C', 'C', 'B', 'C', 'B', 'B', 'A', 'A', 'C', 'C', 'C', 'A', 'C']

03 반복문 심화

-01 여러 대상에 대한 반복처리


ex) emp에서 새 급여 출력
    단, 10번 부서는 기존 급여의 10% 인상된 급여, 20번 부서는 15% 인상된 급여, 30번 부서는 20% 인상된 급여

 

# 잘못된 접근)
# 매 결과마다 SAL 열 전체를 계속해서 반복하게 되므로, 총 14 * 14개의 결과를 리턴
# 각 행마다의 DEPTNO, SAL 둘 다 하나씩 FETCH를 해야한다.
newsal = []
for i in emp['DEPTNO'] :
    if i == 10 :
        newsal.append(emp['SAL'] * 1.1)
    elif i == 20 :
        newsal.append(emp['SAL'] * 1.15)
    else :
        newsal.append(emp['SAL']  * 1.2)


# 방법1) 위치기반 for문
newsal = []
for i in range(0,14) :
    if emp['DEPTNO'][0] == 10 :
        newsal.append(int(emp['SAL'][i] * 1.1))
    elif emp['DEPTNO'][0] == 20 :
        newsal.append(int(emp['SAL'][i] * 1.15))
    else :
        newsal.append(int(emp['SAL'][i] * 1.2))

newsal
Out[182]: 
[919,
 1839,
 1437,
 3421,
 1437,
 3277,
 2817,
 3449,
 5750,
 1724,
 1265,
 1092,
 3449,
 1494]

 

# 방법2) zip을 사용한 동시 fetch (*****)
newsal = []
for i, j in zip(emp['DEPTNO'], emp['SAL']) :
    if i == 10 :
        newsal.append(int(j * 1.1))
    elif i == 20 :
        newsal.append(int(j * 1.15))
    else :
        newsal.append(int(j * 1.2))

newsal
Out[184]: 
[919,
 1920,
 1500,
 3421,
 1500,
 3420,
 2695,
 3449,
 5500,
 1800,
 1265,
 1140,
 3449,
 1430]

[ 연습문제 - zip ]
std에서 표준몸무게 출력
표준몸무게는 다음과 같이 구한다고 가정한다. : 
키 >= 170 -> (키 - 100) * 0.9 
키 < 170 -> 키-100

* 비만여부는 
# 몸무게 > 표준몸무게 : 비만
# 몸무게 < 표준몸무게 : 저체중
# 몸무게 = 표준몸무게 : 정상

 

biman = []
for i, j in zip(std['HEIGHT'], std['WEIGHT']) :
    
    # 키에 따른 표준몸무게 생성
    if i >= 170 :
        vweight = (i - 100) * 0.9 
    else : 
        vweight = (i - 100)
    
    # 비만여부 결정
    if j > vweight :
        biman.append('비만')
    elif j < vweight :
        biman.append('저체중')
    else :
        biman.append('정상')

biman

biman
Out[217]: 
['정상',
 '저체중',
 '저체중',
 '비만',
 '저체중',
 '저체중',
 '저체중',
 '저체중',
 '저체중',
 '저체중',
 '저체중',
 '비만',
 '비만',
 '저체중',
 '저체중',
 '저체중',
 '저체중',
 '비만',
 '비만',
 '저체중']

 -02 중첩 반복문

list2 = [[1,2,3],[4,5,6],[7,8,9]]
df = DataFrame(list2, columns = list('ABC'))

df
Out[229]: 
   A  B  C
0  1  2  3
1  4  5  6
2  7  8  9

 

for i in list2 :
    for j in i :
        print(j)

for i in list2 :
    for j in i :
        print(j)

1
2
3
4
5
6
7
8
9

ex) df 모든 출력형식을 소숫점 둘째자리로 표현해서 저장
outlist = []
for i in df.values :
    inlist = []
    for j in i :
        inlist.append('%.2f' % j)
    outlist.append(inlist)

outlist
Out[244]: [['1.00', '2.00', '3.00'], ['4.00', '5.00', '6.00'], ['7.00', '8.00', '9.00']]


df.applymap(lambda x : '%.2f' % x)

df.applymap(lambda x : '%.2f' % x)
C:\Users\--\3137142294.py:1: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.
  df.applymap(lambda x : '%.2f' % x)
Out[245]: 
      A     B     C
0  1.00  2.00  3.00
1  4.00  5.00  6.00
2  7.00  8.00  9.00

ex) card_history.csv 파일을 읽고 천 단위 구분기호 삭제
card = pd.read_csv('card_history.csv', encoding = 'cp949')
card

card = card.iloc[:, 1:]

outlist = []
for i in card.values : 
    inlist = []
    for j in i :
        inlist.append(j.replace(',',''))
    outlist.append(inlist)
    
outlist
card[:] = outlist  # key-value 구조 유지를 위해 원소만 덮어씌우기를 지정한다. [:]

card
Out[271]: 
      식료품      의복    외식비      책값 온라인소액결제    의료비
0   19400  143000   8600   29000    5600  19200
1   22200  120400   7000   26000    3300  13000
2   24600   88500   7500   22000    7500  16600
3   22300  124800   7700   78000    3900  28100
4   31800  130100   8400   25000    7700  20500
5   43000  118200   6300   25000    4300  32500
6   29400  147600  10700   24000   12000  26500
7   29200  161900   7500   33000    6300   3500
8   29100  134900   4600   27000    7300  18700
9   24000  136100   8100   32000    6600  24400
10  30100  139600   7500   23000    7300  27300

 

card.applymap(lambda x : int(x.replace(',','')))

card.applymap(lambda x : int(x.replace(',','')))
C:\Users\--\3547279066.py:1: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.
  card.applymap(lambda x : int(x.replace(',','')))
Out[272]: 
      식료품      의복    외식비      책값  온라인소액결제    의료비
0   19400  143000   8600   29000     5600  19200
1   22200  120400   7000   26000     3300  13000
2   24600   88500   7500   22000     7500  16600
3   22300  124800   7700   78000     3900  28100
4   31800  130100   8400   25000     7700  20500
5   43000  118200   6300   25000     4300  32500
6   29400  147600  10700   24000    12000  26500
7   29200  161900   7500   33000     6300   3500
8   29100  134900   4600   27000     7300  18700
9   24000  136100   8100   32000     6600  24400
10  30100  139600   7500   23000     7300  27300

 -03 반복 제어문

반복문 수행 시 특정 조건의 경우 반복 행위를 스킵하거나 아예 반복문 자체를 종료하는 구문이다.

shell 스크립트에서도 동일하게 작성된다.

 

 1) continue (in R : next)

특정 조건을 만족하는 경우 반복 행위를 스킵할 때 사용하는 구문이다.

 

ex) 1~10 출력 중 5의 출력만 스킵하기
for i in range(1,11) :
    print(i)

for i in range(1,11) :
    print(i)
1
2
3
4
5
6
7
8
9
10


for i in range(1,11) :
    if i == 5 :
        continue
    print(i)

for i in range(1,11) :
    if i == 5 :
        continue
    print(i)
1
2
3
4
6
7
8
9
10

 2) break

특정 조건을 만족하는 경우 그 이후 반복 행위를 아예 중단하는 구문이다.

 

ex) 1~10 출력 중 5부터의 출력은 중단

for i in range(1,11) :
    if i == 5 :
        break
    print(i)

1
2
3
4

 3) exit

프로그램을 즉시 중단한다.

종료코드 : 0(정상), 1(비정상)

for i in range(1,11) :
    if i == 5 :
        exit(1)
    print(i)

 


 4) pass

v1 = 10
if v1 > 3 :
    pass
else :
    print('error')
    
v1 = 1
if v1 > 3 :
    pass
else :
    print('error')

v1 = 10
if v1 > 3 :
    pass
else :
    print('error')


v1 = 1
if v1 > 3 :
    pass
else :
    print('error')
error

ex) 1부터 100까지의 누적합을 연산하다가 누적합이 3000이 넘는 지점을 확인
vsum = 0
for i in range(1,101) :
    vsum = vsum + i
    
    if vsum >= 3000:
        break
    
print(i)

vsum = 0
for i in range(1,101) :
    vsum = vsum + i
    
    if vsum >= 3000:
        break

print(i)

77

 

print(vsum)    

print(vsum)    
3003