
지난번 배웠던 판다스의 기본 자료 구조 시리즈(Series)에 이어, 2차원 데이터 구조 데이터프레임(DataFrame) 대해 알아봅시다.
판다스의 자료구조 데이터프레임은, 엑셀의 데이터 시트처럼 2차원 배열입니다. 다음의 특징을 가지는데 행과 열로 구성되는 2차원 데이터 구조이고 각 열은 각각 데이터 타입(dtype)을 갖고 있습니다.
🔘2차원 데이터구조 - xlsx 문서의 시트처럼
🔘행(row), 열(column)으로 구성
🔘각 열(column)은 각각의 데이터 타입을 가짐
대표적으로 2차원 리스트를 통해 생성하는 방법, 딕셔너리를 통해 생성하는 방법 두가지가 있습니다.
import pandas as pd
pd.DataFrame([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>

판다스 DataFrame() 메서드를 통해 데이터프레임을 만듭니다. 2차원 리스트를 입력하면 이를 데이터프레임으로 바꾸어줍니다.
pd.DataFrame([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], columns=['가', '나', '다'])
>>

0부터 순서대로 자동 생성되는 컬럼명 대신 직접 입력한 컬럼명을 쓰고 싶다면, columns=[]를 통해 임의로 지정해줄 수 있습니다.
dictionary를 통해 데이터프레임을 생성할 수도 있습니다. 2차원 리스트를 DataFrame() 메서드에 넣어 생성하는 것과 비슷하지만, 딕셔너리의 key값이 자동적으로 column 명으로 변환된다는 점에서 더 편리할 때가 많습니다.
import pandas as pd
data = {
'이름': ['김철수', '이영희', '홍길동'],
'학교': ['서울고', '대전고', '경기고'],
'점수': [80, 95, 85]
}
pd.DataFrame(data)
>>

딕셔너리의 key값은 column 명으로 사용되고, 딕셔너리의 value값은 리스트의 형태로 있어야 합니다.
위에서 생성한 데이터프레임을 예로 들어, DataFrame이 갖는 속성 몇가지를 알아봅시다.
import pandas as pd
data = {
'이름': ['김철수', '이영희', '홍길동'],
'학교': ['서울고', '대전고', '경기고'],
'점수': [80, 95, 85]
}
df = pd.DataFrame(data)
print(df)
>>

데이터프레임의 1열에서 index를 확인할 수 있습니다. index를 따로 지정하거나 변경하지 않았다면, 데이터프레임의 인덱스는 기본 값으로 RangeIndex를 가집니다.
import pandas as pd
print(df.index)
>> RangeIndex(start=0, stop=3, step=1)
데이터프레임의 열 레이블 이름을 컬럼(column)이라고 합니다. df.columns을 통해 컬럼 명을 불러올 수 있습니다.
print(df.columns)
>> Index(['이름', '학교', '점수'], dtype='object')
데이터 값들을 Numpy Array형식으로 가져옵니다.
print(df.values)
>> array([['김철수', '서울고', 80],
['이영희', '대전고', 95],
['홍길동', '경기고', 85]], dtype=object)
column 마다 갖고있는 데이터 타입들을 불러옵니다.
print(df.dtypes)
>> 이름 object
학교 object
점수 int64
dtype: object
데이터프레임을 전치(Transpose)하여 보여줍니다.
print(df.T)
>>

print(df)
>>

df.index에 리스트 형태로 바인딩하여 인덱스를 지정해 줄 수 있습니다.
df.index = ['1번', '2번', '3번']
print(df)
>>

print(df.index)
>> Index(['1번', '2번', '3번'], dtype='object')
새롭게 인덱스를 지정한 후 df.index를 찍어 보면, 기존의 RangeIndex에서 지정한 값으로 바뀐 것을 확인할 수 있습니다.
컬럼으로 데이터를 필터링하는 등의 다양한 작업을 할 수 있습니다.
딕셔너리에서 key값으로 value를 가져오는 것 처럼, DataFrame에 key 값으로 column의 이름을 지정하여 column을 선택할 수 있습니다.
DataFrame명['Column명']을 통해 한개의 컬럼을 가져올 수 있습니다. 한개의 컬럼을 선택시 해당하는 컬럼의 자료들이 Series로 불러집니다.
print(df)
>>

print(df['이름'])
>> 0 김철수
1 이영희
2 홍길동
Name: 이름, dtype: object
Fancy indexing으로 2개 이상의 column을 선택하여 볼 수 있습니다. 선택할 column들을 대괄호로 묶어 DataFrame명['Column명']안에 넣어주어야 합니다.
print(df[['이름', '점수']])
>> 이름 점수
0 김철수 80
1 이영희 95
2 홍길동 85
위의 예는 Fancy Indexing으로 두가지 컬럼(이름, 점수)을 가져오는 예시 코드입니다.
rename() 메서드를 통해 column명을 변경할 수 있습니다.
df = df.rename(columns={'이름': 'name', '점수':'score'})
print(df)
>>

각각 '이름'과 '점수'였던 column명이 'name', 'score'로 바뀐 것을 확인해봅시다.
메서드를 통해 df를 수정할 수 있지만, 수정한 데이터프레임을 다시 바인딩 해주어야 변경사항이 적용된다는 번거로움이 있습니다. inplace=True옵션을 통해 변경사항을 바로 적용할 수 있습니다.
컬럼명을 변경하는 위의 코드를 확인해보면, df.rename으로 수정한 데이터프레임을 다시 df에 바인딩해주고 있는것을 확인할 수 있습니다.
df.rename(columns={'name': '이름'}, inplace=True)
print(df)
위와 같이, inplace 옵션을 사용하면 바인딩을 한번 거치는 과정을 생략할 수 있습니다.