본문 바로가기
Python/Pandas

데이터 프레임 수정의 모든 것: 행, 열, Cell 값 추가/변경/제거

by 모두의 케빈 2022. 11. 14.

안녕하세요. 모두의 케빈입니다.

오늘은 데이터 프레임을 수정하는 방법에 대해 배워보고자 합니다.

 

■ 데이터 프레임의 수정

 

일을 하다 보면, 호출한 데이터 프레임을 파이썬 환경 내에서 변경해야 하는 경우가 종종 생깁니다. 열의 이름, 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 값의 처리와 제어

 

댓글