지난번 배웠던 판다스의 기본 자료 구조 시리즈(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 옵션을 사용하면 바인딩을 한번 거치는 과정을 생략할 수 있습니다.