[pandas] 데이터프레임 수정하기

파이썬 라이브러리 pandas로 데이터 프레임을 다루는 방법에 대해 정리했다.

열 이름 지정/수정하기

다른 소스에서 데이터를 가져올 때 종종 열 이름을 변경해야 할 필요가 있다.

예를 들어 열 이름에 공백이나 특수문자로 들어가 있으면, 혹은 숫자로 시작하면 df['column_name']과 같은 방식으로 다루어야 하지만, 모든 열 이름이 변수 이름 규칙을 잘 따르면 df.column_name와 같은 방식으로 간단히 다룰 수 있다.

어쨌든 열 이름을 한 번에 지정하려면 두 가지 방법이 있다.

1) df.columns()

.columns() 안에 열 이름 전체 리스트를 넣어 지정하는 방법

df = pd.DataFrame({\
    'name': ['John', 'Jane', 'Sue', 'Fred'],\
    'age': [23, 29, 21, 18]
    })

df.columns = ['First Name', 'Age']

2) df.rename()

.rename(columns={'old_column_name': 'new_column_name'}) 형식의 딕셔너리 형태로 이름 변경사항을 넣어 지정하는 방법

df = pd.DataFrame({\
    'name': ['John', 'Jane', 'Sue', 'Fred'],\
    'age': [23, 29, 21, 18]})

df.rename(columns={'name': 'First Name', 'age': 'Age'}, inplace=True)

.rename()은 기존 데이터 프레임은 유지한 상태에서 새로운 열 이름이 부여된 데이터 프레임을 따로 가져온다. 만약 기존 프레임을 새로운 데이터 프레임으로 수정하려면 inplace=True를 넣어주면 된다. (단, 기존 열 이름 중 하나의 철자가 틀리더라도 이 구문에서는 오류가 나지 않는다. 그냥 아무 것도 변경하지 않고 넘어간다.)

.rename()은 특정 열 이름을 직접 선택해서 수정하는 방식이기 때문에 실수를 방지할 수 있다는 점에서 .column()보다 나을 때가 있다.


열 데이터 추가/수정하기 (직접 입력)

데이터 프레임에 ‘Quantity’라는 열을 하나 추가하고 싶다면, df에 열을 선언하고 리스트를 바로 할당하면 된다. 이렇게.

df['Quantity'] = [100, 150, 50, 35]

단, df.column_name형식으로 쓰면 안 된다. 이런 방식은 기존에 존재하는 열을 불러올 땐 가능하지만 처음에 열을 생성하려면 무조건 df['column_name']으로 해야 한다. 

df에 열을 선언하고 리스트가 아닌 값 하나만 입력해도 된다.

df['In Stock?'] = True

열 데이터 추가/수정하기 (기존 열 참조 )

1) 계산하기

‘Sales Tax’라는 열을 추가하고, 그 값은 ‘Price’의 7.5%로 계산해서 넣고 싶다면 이렇게 하면 된다.

df['Sales Tax'] = df[‘Price’] * 0.075

2) 함수 적용하기

.apply()를 사용하고 괄호 안에 함수 이름을 넣으면 그 함수가 적용되기도 한다.

예를 들어 아래와 같은 df에서 

‘Name’열에 들어간 문자열을 모두 대문자로 수정하고 싶다면 이렇게 하면 된다.

from string import upper
df['Name'] = df['Name'].apply(upper)

.apply() 안에는 lambda 함수를 넣어도 된다.

‘Email’ 열에 들어간 이메일 주소에서 @뒷부분만 가져오고 싶다면

df['Email Provider'] = df.Email.apply(lambda x: x.split('@')[-1])

한 번에 여러 열을 참조해서 적용할 수도 있다.

단일 열을 지정하지 않고, df 뒤에 바로 .apply()를 사용한 후 axis=1이라고 적어주면 람다 함수의 입력은 열이 아닌 전체 행이 된다. 그리고 행의 특정 값에 액세스할 땐 row.column_name 또는 row[‘column_name']을 사용한다.

df['Price with Tax'] = df.apply(lambda row:\
        row['Price'] * 1.075 \
        if row['Is taxed?']=='Yes' \
        else row['Price'], \
        axis=1)

추천 글

댓글 남기기