안녕하세요. 모두의 케빈입니다.
오늘은 데이터 프레임을 수정하는 방법에 대해 배워보고자 합니다.
■ 데이터 프레임의 수정
일을 하다 보면, 호출한 데이터 프레임을 파이썬 환경 내에서 변경해야 하는 경우가 종종 생깁니다. 열의 이름, Index, 특정 Cell의 값 등을 변경하거나 제거할 수도 있고 함수를 적용하여 새로운 열을 추가하거나 제거할 수 있습니다. 지금부터 이런 경우에 대해 하나씩 실습해보고자 합니다.
실습을 위한 데이터 프레임 생성
# 실습을 위한 데이터 프레임 만들기
# 성별, 거주지, 국어점수, 수학점수, 영어점수로 이루어진 (100,5) 데이터 프레임
import random
import pandas as pd
gender_list = []
city_list = []
math_score = []
korean_score = []
english_score = []
for i in range(100):
gender = random.randrange(0,2)
city = random.randrange(0,5)
if gender == 0:
gender_list.append('male')
else:
gender_list.append('female')
if city == 0:
city_list.append('Seoul')
elif city == 1:
city_list.append('Busan')
elif city == 2:
city_list.append('Gwangju')
else:
city_list.append('daejion')
math_score.append(random.randint(10,100))
korean_score.append(random.randint(10,100))
english_score.append(random.randint(10,100))
df = pd.DataFrame({"성별":gender_list, "거주지":city_list, "수학점수":math_score, "국어점수":korean_score, "영어점수":english_score})
df
성별 거주지 수학 국어 영어
0 female Gwangju 96 11 49
1 male daejion 82 83 88
2 female daejion 50 83 15
3 female daejion 35 77 22
4 male daejion 69 60 46
... ... ... ... ... ...
95 female Seoul 12 81 21
96 male Gwangju 69 48 32
97 female Seoul 19 72 71
98 male daejion 50 23 60
99 female Gwangju 88 96 88
100 rows × 5 columns
■ Cell 값 수정
직접 지정하여 Cell 값 변경하기
특정 Cell 값을 변경할 때는 해당 Cell을 직접 지정 후, 변경해주면 됩니다. 지정하는 방식은 iloc, loc 등 어떠한 방법을 사용해도 괜찮습니다. 저는 쉽게 iloc을 활용하여 가장 첫 번째 값을 변경해보도록 하겠습니다.
df.iloc[0,0] = "변경완료"
df.head(10)
성별 거주지 수학 국어 영어
0 변경완료 Gwangju 96 11 49
1 male daejion 82 83 88
2 female daejion 50 83 15
3 female daejion 35 77 22
4 male daejion 69 60 46
5 male daejion 44 10 23
6 male daejion 88 38 16
7 male Busan 66 67 26
8 female Seoul 10 91 98
9 female Seoul 70 87 87
조건을 만족하는 Cell 값만 변경
특정 조건을 만족하는 Cell 값들만 변경할 수 있습니다. 수학 점수가 90점이 넘는 Cell 값을 9999 점으로 변경해보도록 하겠습니다.
df.loc[df_실습["수학"] > 90, "수학"] = 9999
df.head(10)
성별 거주지 수학 국어 영어
0 male Seoul 41 34 92
1 female Gwangju 90 70 23
2 male Gwangju 66 36 18
3 male daejion 9999 87 13
4 male Gwangju 66 58 83
5 female Gwangju 66 28 48
6 female daejion 18 62 68
7 male daejion 34 48 75
8 female daejion 80 54 57
9 female daejion 77 49 18
replace를 활용하여 Cell 값 변경하기
특수한 값만 선택적으로 골라서 다른 값으로 대체하고 싶은 경우에는 replace 메서드를 사용하면 됩니다.
df.loc[df["수학"] > 90, "수학"] = 9999
df = df.replace(9999,100)
df
특정 열만 선택적으로 replace 메서드를 적용할 수 있습니다.
df.loc[df["수학"] > 90, "수학"] = 9999
df.loc[df["국어"] > 90, "국어"] = 9999
df.loc[df["영어"] > 90, "영어"] = 9999
df = df.replace({"수학":9999},100)
df
성별 거주지 수학 국어 영어 평균
0 male Gwangju 21 87 56 54.7
1 male daejion 57 9999 85 78.0
2 female Busan 32 58 77 55.7
3 male Busan 68 41 63 57.3
4 male Seoul 56 40 37 44.3
... ... ... ... ... ... ...
95 male Busan 86 22 9999 68.7
96 female daejion 86 17 9999 67.7
97 female Seoul 100 64 35 66.3
98 female daejion 44 71 54 56.3
99 female Seoul 15 40 33 29.3
■ 행(Row), 열(Column) 값 수정
행(Row) 값 추가
데이터 프레임의 제일 마지막 줄에 새로운 데이터를 추가해보겠습니다. 주의할 점은, 열(Column)의 양식에 맞춰서 데이터를 추가해야 한다는 점입니다.
df.loc[100] = ['male', 'Seoul',100,100,100]
df
성별 거주지 수학 국어 영어
0 male Busan 35 50 21
1 male Seoul 56 68 19
2 male Gwangju 42 46 45
3 male Seoul 49 62 55
4 female Seoul 70 19 60
... ... ... ... ... ...
96 female Gwangju 52 22 51
97 female Busan 59 23 89
98 female Gwangju 11 90 71
99 male Busan 29 85 29
100 male Seoul 100 100 100
101 rows × 5 columns
append() 메서드를 사용하여 새로운 데이터를 추가할 수 있습니다. 다만, 열 이름과 값을 모두 입력해줘야 하는 번거로움이 있습니다. 그리고 주의할 점은, ingore_index = True로 설정해줘야 합니다. 그래야 에러가 발생하지 않습니다.
df = df.append({"성별":"female", "거주지":"Busan","수학":100,"국어":100,"영어":100}, ignore_index = True)
df
성별 거주지 수학 국어 영어
0 male Busan 35 50 21
1 male Seoul 56 68 19
2 male Gwangju 42 46 45
3 male Seoul 49 62 55
4 female Seoul 70 19 60
... ... ... ... ... ...
97 female Busan 59 23 89
98 female Gwangju 11 90 71
99 male Busan 29 85 29
100 male Seoul 100 100 100
101 female Busan 100 100 100
102 rows × 5 columns
중간에 행을 삽입하기 위해서는 concat과 loc을 함께 사용해야 합니다. 삽입을 희망하는 index의 위, 아래를 자르고 새로운 데이터와 함께 붙이는 방식입니다.
insert_index = 10
before_df = df[:insert_index]
insert_data = pd.DataFrame([["male","Gwangju", 90,90,90]], columns = df.columns)
after_df = df[insert_index:]
new_df = pd.concat([before_df, insert_data, after_df], ignore_index = True)
new_df.loc[10]
성별 male
거주지 Gwangju
수학 90
국어 90
영어 90
Name: 10, dtype: object
특정 행의 값을 변경하는 방법은 추가하는 방법과 크게 다르지 않습니다.
df.loc[0] = ['변경','변경',0,0,0]
df.head(5)
성별 거주지 수학 국어 영어
0 변경 변경 0 0 0
1 male daejion 57 100 85
2 female Busan 32 58 77
3 male Busan 68 41 63
4 male Seoul 56 40 37
새로운 열(Column) 추가
데이터 프레임에 값이 모두 0인 새로운 열을 추가해보겠습니다.
df["평균"] = 0
df.head(5)
성별 거주지 수학 국어 영어 평균
0 male Gwangju 21 87 56 0
1 male daejion 57 92 85 0
2 female Busan 32 58 77 0
3 male Busan 68 41 63 0
4 male Seoul 56 40 37 0
함수를 적용하여 새로운 열을 추가할 수 있습니다.
df["평균"] = round((df["수학"]+df["국어"]+df["영어"])/3,1)
df.head(5)
성별 거주지 수학 국어 영어 평균
0 male Gwangju 21 87 56 54.7
1 male daejion 57 92 85 78.0
2 female Busan 32 58 77 55.7
3 male Busan 68 41 63 57.3
4 male Seoul 56 40 37 44.3
행(Row)과 열(Column) 제거하기: drop() 메서드
특정 행과 열을 제거하기 위해서는 drop() 메서드를 사용합니다.
df.drop("평균", axis=1).head(5) # 평균 열을 통째로 제거
성별 거주지 수학 국어 영어
0 male Gwangju 21 87 56
1 male daejion 57 100 85
2 female Busan 32 58 77
3 male Busan 68 41 63
4 male Seoul 56 40 37
df.drop(0, axis=0).head(5) # 첫 번째 행을 제거
성별 거주지 수학 국어 영어 평균
1 male daejion 57 100 85 80.7
2 female Busan 32 58 77 55.7
3 male Busan 68 41 63 57.3
4 male Seoul 56 40 37 44.3
5 female daejion 69 66 33 56.0
■ 행(Row, index), 열(Column) 이름 변경
열(Column) 이름 변경
열 이름 변경은 rename() 메서드를 활용하여 일부만 선택적(혹은 전체 다)으로 변경할 수 있습니다.
df.rename(columns = {"성별":"gender", "거주지":"city",
"수학":"math","국어":"korean"}).head(5)
gender city math korean 영어 평균
0 male Gwangju 21 87 56 54.7
1 male daejion 57 100 85 80.7
2 female Busan 32 58 77 55.7
3 male Busan 68 41 63 57.3
4 male Seoul 56 40 37 44.3
또한 columns() 메서드를 활용하여 전체 열 이름을 일괄적으로 변경할 수 있습니다.
df.columns = ["gender","city","math","korean","english","mean"]
df.head(5)
gender city math korean english mean
0 male Gwangju 21 87 56 54.7
1 male daejion 57 100 85 80.7
2 female Busan 32 58 77 55.7
3 male Busan 68 41 63 57.3
4 male Seoul 56 40 37 44.3
행 이름(index) 변경
행 이름은 index라고도 합니다. index를 변경할 때는 신중해야 하는데, 변경하기 전 기존 index를 reset 시키는 습관을 들여야 합니다. 그렇지 않으면 index가 변경되면서 기존 index 값이 모두 사라집니다.
우선 첫 번째 방법은 기존 열을 통째로 새로운 index로 설정하는 방법입니다.
df.reset_index(drop=True)
df.set_index("gender").head(5)
city math korean english mean
gender
male Gwangju 21 87 56 54.7
male daejion 57 100 85 80.7
female Busan 32 58 77 55.7
male Busan 68 41 63 57.3
male Seoul 56 40 37 44.3
두 번째 방법은 기존의 데이터 프레임은 그대로 유지한 채, 값만 차용하여 index 이름을 변경하는 방법입니다.
df.reset_index(drop=True)
df.rename(index=df["gender"]).head(5)
gender city math korean english mean
male male Gwangju 21 87 56 54.7
male male daejion 57 100 85 80.7
female female Busan 32 58 77 55.7
male male Busan 68 41 63 57.3
male male Seoul 56 40 37 44.3
유사한 방법으로 아래와 같은 방법도 있습니다.
df.reset_index(drop=True)
df.index = df["gender"]
df.head(5)
gender city math korean english mean
gender
male male Gwangju 21 87 56 54.7
male male daejion 57 100 85 80.7
female female Busan 32 58 77 55.7
male male Busan 68 41 63 57.3
male male Seoul 56 40 37 44.3
긴 글 읽어주셔서 감사합니다. 궁금하신 점이 있다면 댓글로 남겨주세요. :)
[Tip] 알면 도움이 되는 참고 자료: 데이터 프레임 정보 확인하기
[1편] 데이터 프레임 살펴보기: head, tail, columns, values, shape, info, dtypes, describe, value_counts, unique
[2편] 데이터 프레임 살펴보기: Null 값의 처리와 제어
'Python > Pandas' 카테고리의 다른 글
데이터 프레임의 행렬곱: AI의 기본 (0) | 2022.11.22 |
---|---|
[Python 기초] 데이터 프레임 중복값 제거: drop_duplicate 예제와 사용법 (0) | 2022.11.21 |
[2편] 데이터 프레임 살펴보기: Null 값의 처리와 제어 (0) | 2022.11.13 |
[1편] 데이터 프레임 살펴보기: head, tail, columns, values, shape, info, dtypes, describe, value_counts, unique (0) | 2022.11.10 |
DataFrame 병합하기: concat, merge, join (0) | 2022.11.09 |
댓글