ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬] 데이터프레임에서 조건에 맞는 값 변경하는 두 가지 방법
    파이썬 배우기 2023. 11. 20. 17:14

    데이터프레임에서 수정하고 싶은, 조건에 맞는 값을 변경하는 두 가지 방법에 대해 소개하겠습니다.

      - 첫 번째 방법은 데이터프레임의 인덱스와 컬럼 값을 이용하여 값을 바꾸는 방법이고

      - 두 번째 방법은 at 과 iterrows() 함수를 이용하는 방법입니다. 

    두 번째 방법이 더 복잡한데, 그럼에도 불구하고 at을 쓰는 이유는 인덱싱에서 빠른 작업 속도를 갖기 때문입니다. 임의의 데이터프레임을 만들어서 예제를 보여드려 소요시간에 차이는 없지만 혹시 궁금하신 분은 아래 코드를 이용해서 확인해보시면 좋을 것 같습니다.

    # 수행코드 맨 윗줄에 삽입
    start = time.time() 
    
    # 수행코드 맨 아랫줄에 삽입
    print("소요시간 : %.3f초" %(time.time()-start))

     

    우선, 예제 데이터프레임을 만듭니다. 그리고 각 과목에서 0미만안 점수를 0으로, 100 초과인 점수를 100으로 바꾸려고 합니다.

    score = pd.DataFrame({"name":['Kim','Lee','Park'],
                          "kor":[-46,102,95],
                          "math":[95,105,80],
                          "eng":[107,85,50]                    
                         })
    score.set_index('name',inplace=True)
          kor  math  eng
    name                
    Kim   -46    95  107
    Lee   102   105   85
    Park   95    80   50

     

     

    1. df[컬럼][인덱스] 

    for subject in score.columns:  #score.columns : ['kor', 'math', 'eng']
        for student in score.index:  #score.index : ['Kim', 'Lee', 'Park']
            if score[subject][student] < 0 :
                score[subject][student] = 0
            elif score[subject][student] > 100 :
                score[subject][student] = 100
    score

     

    2. iterrows()와 at 사용하기

    for student, subject_score in score.iterrows():
        for subject in score.columns:
            if subject_score[subject] < 0 :
                score.at[student, subject] = 0
            elif subject_score[subject] > 100 :
                score.at[student, subject] = 100
    score

     

    참고로 iterrows() 함수는 이름에서 유추할 수 있듯, 데이터프레임에서 (index, Series) 형태로 행을 반복하는 것입니다.

      - Docstring : Iterate over DataFrame rows as (index, Series) pairs.

     

    실제 생긴 형태를 살펴보면 

    for temp in score.iterrows():
        print(temp)
      
     # Result
    ('Kim', kor       0
    math     95
    eng     100
    Name: Kim, dtype: int64)
    ('Lee', kor     100
    math    100
    eng      85
    Name: Lee, dtype: int64)
    ('Park', kor     95
    math    80
    eng     50
    Name: Park, dtype: int64)

     

    (Index, Series) 형태를 더 자세히 살펴보려면, 

    for temp in score.iterrows():
        print(temp[0]) # Index
        print("-------------")
        print(temp[1]) #Series
        print("=============")
        
    # Result
    Kim
    -------------
    kor       0
    math     95
    eng     100
    Name: Kim, dtype: int64
    =============
    Lee
    -------------
    kor     100
    math    100
    eng      85
    Name: Lee, dtype: int64
    =============
    Park
    -------------
    kor     95
    math    80
    eng     50
    Name: Park, dtype: int64
    =============

     

Designed by Tistory.