파이썬 라이브러리 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)