본문 바로가기
Python/Pandas

DataFrame 생성, 설명, 소개, 옵션 - pandas(4)

by 콩돌 2019. 10. 9.
반응형

파이썬 버전 3.7 기준

pandas 버전 0.25.1 기준



 DataFrame의 소개와 생성법


본 포스팅에서는 pandas에서의 DataFrame이 소개, 설명, 특징 및 작성법을 다룬다.



 Pandas에서 DataFrame란?


DataFrame은 2차원 테이블 데이터 구조를 가지는 자료형이다. 

그리고 Series와 함께 pandas의 주요 데이터 유형 중 하나이다.


Series 객체를 딕셔너리처럼 모아둔 컨테이너(container)라고 봐도 된다.

   Series 객체를 모아둔 자료구조라 생각하면 이해하기 편하다.

  ○ 스프레트시트나 SQL 테이블이라고 생각해도 무방하다.


 DataFrame의 특징

Pandas의 DataFrame은 몇 가지 특징을 가지는데 다음과 같다.

  ○ DataFrame의 크기가 변경 가능하다. (예: DataFrame 내부에 다른 Series의 추가)

   행 혹은 열이 같지 않은(heterogeneous) 데이터들로 표를 형성시킬 수 있다.

  ○ 산술연산을 수행할 시 Series와 마찬가지로 행과 열 레이블(label)을 정렬시킨 후 산술연산을 진행한다.

  ○ 각 열 마다 다른 자료형(dtype)을 사용하는 것이 가능하다.


 DataFrame의 단순한 생성법

DataFrame 생성은 다음과 같은 구문을 사용하여 수행될 수 있다.

data에 입력되는 변수가 어떤 자료형을 가지느냐에 따라 DataFrame() 함수의 결과는 달라지게 되므로 주의하자.

세부 사항은 본 포스팅의 아랫 부분을 참고 할 수 있다.


DataFrame 생성을 위한 단순한 구문 형식)

DataFrame = pandas.DataFrame(data, index=index, columns=columns)


data

여기서 data는 여러가지 자료형을 포함할 수 있다.

Series와 마찬가지로 DataFrame은 많은 다른 종류의 입력데이터를 사용한다.

   딕셔너리(dictionary, dict)의 값(value)에 다음의 자료형을 포함할 때

    ▷ 1차원 ndarray

    ▷ 리스트(list)

    ▷ Series

    ▷ 딕셔너리

   하나의 Series

   2차원 numpy.ndarray, 리스트의 리스트

   구조체(structured) ndarray 혹은 record ndarray

   또다른 DataFrame


index

입력된 index는 행의 레이블의 리스트를 입력받는다. 


columns

입력된 columns는 열의 레이블의 리스트를 입력받는다. 


※ 주의사항

  Series나 DataFrame을 불러올때 대소문자가 구분된다. 

  즉, Series를 사용할 시 맨 앞에 S는 반드시 대문자 S를 사용하여야 한다.

  DataFrame을 사용 시에는 D와 F는 반드시 대문자 D와 F를 사용하여야 한다.



 DataFrame 생성시 행과 열의 레이블 설정

DataFrame 생성시에 행과 열의 레이블을 설정할 수 있다.

데이터 종류와 필요에 따라 DataFrame() 함수의 입력변수를 활용함으로써 가능하다.

  ○ index: 행(row)의 레이블을 설정한다.

  ○ columns: 열(column)의 레이블을 설정한다.

위의 입력변수들을 활용시 결과로 출력되는 DataFrame의 행의 레이블(index)나 열의 레이블(columns)를 사용자 입맛에 맞게 설정 가능하다.

  ○ Series의 딕셔너리를 사용하고 index를 입력할 시 index에 입력된 레이블과 딕셔너리 키(key)가 매칭되지 않다면 데이터를 삭제한다.


축라벨이 입력되지 않은 경우, pandas는 공통 규칙을 적용하여 입력데이터로부터 축 라벨을 구성한다.


참고사항 

  Series와 마찬가지로 파이썬과 pandas의 버전에 따라 딕셔너리를 입력시 columns가 명시되지 않을 경우 정렬순서가 바뀐다. 

  파이썬 버전 3.6이상 그리고 pandas버전 0.23이상인 경우

    ○ DataFrame 열들은 딕셔너리의 키(key) 배열 순서에 따라 정렬된다.

  파이썬 버전 3.6 미만이거나, pandas 버전이 0.23미만인 경우

    ○ 위와 같은 상황에서는 딕셔너리 키(key)의 알파벳 순으로 정렬된다.



 DataFrame 작성법


DataFrame은 위에 언급했다시피 다양한 데이터를 활용하여 형성이 가능하다. 

이 섹션에서는 다양한 데이터를 활용한 DataFrame을 자세히 설명하고 예제를 작성해볼 것이다.

이 섹션에서는 DataFrame 생성을 위해 다음과 같이 총 6가지 방법에 대해 할 것이다.

  ① Series나 딕셔너리의 딕셔너리

  ② 리스트나 ndarray의 딕셔너리

  ③ 리스트의 딕셔너리 

  ④ 구조체 레코드 배열

  ⑤ 튜플의 딕셔너리

  ⑥ 하나의 Series



 ① Series나 딕셔너리의 딕셔너리로부터의 DataFrame 생성 

결과로 출력되는 인덱스는 다양한 Series의 합집합으로 구성된다. 

만약 Series가 아닌 딕셔너리가 존재한다면, 초기에 Series로 변환된다.

만약 columns에 입력이 되질 않는다면, 열들은 정렬된 딕셔너리 키의 리스트로 세팅된다. 


딕셔너리(Series, 딕셔너리)로부터의 DataFrame 생성 예)

# pandas의 import

In[2]: import pandas as pd

...

# 딕셔너리로부터의 DataFrame 생성

In[3]: dict_s = {'column_a': pd.Series([1,2,3,4], index=['index_a', 'index_b', 'index_c', 'index_d']), 

                     'column_b': pd.Series([5,6,7] ,index=['index_a', 'index_b', 'index_c']),

                     'column_c': {'index_c': 8, 'index_d': 9} }

In[4]: dataframe1 = pd.DataFrame(dict_s)

In[5]: dataframe1

Out[5]: 

         column_a  column_b  column_c

index_a         1       5.0       NaN

index_b         2       6.0       NaN

index_c         3       7.0       8.0

index_d         4       NaN       9.0


# index와 columns 입력변수를 이용한 생성

In[6]: dataframe1 = pd.DataFrame(dict_s, index= ['index_b', 'index_c'], columns= ['column_b', 'column_c', 'column_d'])

In[7]: dataframe1

Out[7]: 

         column_b  column_c column_d

index_b         6       NaN      NaN

index_c         7       8.0      NaN


행과 열 레이블은 index와 columns 어트리뷰트를 사용하여 개별적으로 접근이 가능하다.


참고사항 

  열의 특정한 세트가 데이터의 딕셔너리를 따라 입력이 되었다면, 입력된 열은 딕셔너리의 키를 덮어 쓴다.


index, columns 어트리뷰트의 사용 예)

# pandas의 import

In[2]: import pandas as pd

...

# index, columns 어트리뷰트의 사용

In[8]: dataframe1.index

Out[8]: Index(['index_b', 'index_c'], dtype='object')

In[9]: dataframe1.columns

Out[9]: Index(['column_b', 'column_c', 'column_d'], dtype='object')



 ② 리스트나 ndarray의 딕셔너리부터의 DataFrame 생성

딕셔너리 값(value)에 배정되는 1차원 ndarray와 리스트는 반드시 같은 길이를 가져야 한다.

인덱스가 입력될 경우 인덱스 또한 반드시 배열과 같은 길이를 가져야한다.

인덱스가 입력되지 않을 경우는 인덱스는 자동으로 range(n)으로 설정된다. 

  ○ 여기서 n은 ndarray들의 길이이다.


딕셔너리(1차원 ndarray, 리스트)로부터의 DataFrame 생성 예)

# pandas의 import

In[2]: import pandas as pd

In[10]: import numpy as np

...

# 리스트와 ndarray의 딕셔너리를 활용한 DataFrame 생성

In[11]: dict_s2= {'col_a': [1,2,3,4], 'col_b': np.array([5,6,7,8])}

In[12]: dataframe2 = pd.DataFrame(dict_s2)

In[13]: dataframe2

Out[13]: 

   col_a  col_b

0      1      5

1      2      6

2      3      7

3      4      8


# index입력변수의 사용

In[14]: dataframe2 = pd.DataFrame(dict_s2, index=['a','b','c','d'])

In[15]: dataframe2

Out[15]: 

   col_a  col_b

a      1      5

b      2      6

c      3      7

d      4      8



 ③ 리스트의 딕셔너리

이 경우는 ②에서 다룬 배열의 딕셔너리에서 다뤄지는 것과 유사하다.


딕셔너리로 이루어진 리스트에서의 DataFrame 생성 예)

# pandas의 import

In[2]: import pandas as pd

...

# 딕셔너리로 구성된 리스트로부터의 DataFrame 생성 

In[22]: list_dict=[{'a': 1.0, 'b':2.0}, {'a': 3.0, 'b':4.0, 'c':5.0}]

In[23]: dataframe4=pd.DataFrame(list_dict)

In[24]: dataframe4

Out[24]: 

     a    b    c

0  1.0  2.0  NaN

1  3.0  4.0  5.0


# DataFrame 생성 index 사용

In[25]: dataframe4=pd.DataFrame(list_dict, index=['row_a','row_b'])

In[26]: dataframe4

Out[26]: 

         a    b    c

row_a  1.0  2.0  NaN

row_b  3.0  4.0  5.0


# DataFrame 생성 index와 columns 사용

In[27]: dataframe4=pd.DataFrame(list_dict, index=['row_a','row_b'], columns=['d','c','a'])

In[28]: dataframe4

Out[28]: 

        d    c    a

row_a NaN  NaN  1.0

row_b NaN  5.0  3.0



 ④ 구조체(structured) 혹은 record 배열

이 경우는 ②에서 다룬 배열의 딕셔너리에서 다뤄지는 것과 유사하다.


구조체배열 혹은 레코드 배열에서의 DataFrame 생성 예)

# pandas의 import

In[2]: import pandas as pd

In[10]: import numpy as np

...

# 구조체 배열 생성

In[16]: st_arr = np.array([(0, 1.0, 'a'), (3, 4.0, 'b')], dtype=[('col_a','i8'), ('col_b','f8'), ('col_c','a10')])

In[17]: st_arr

Out[17]: 

array([(0, 1., b'a'), (3, 4., b'b')],

      dtype=[('col_a', '<i8'), ('col_b', '<f8'), ('col_c', 'S10')])


# 구조체 배열로 부터의 DataFrame 생성

In[18]: dataframe3=pd.DataFrame(st_arr)

In[19]: dataframe3

Out[19]: 

   col_a  col_b col_c

0      0    1.0  b'a'

1      3    4.0  b'b'


# DataFrame 생성시 index와 columns의 활용

In[20]: dataframe3=pd.DataFrame(st_arr, index=['row_a','row_b'], columns=['col_c','col_a','col_b'])

In[21]: dataframe3

Out[21]: 

      col_c  col_a  col_b

row_a  b'a'      0    1.0

row_b  b'b'      3    4.0


참고사항 

  구조체 배열은 열 레이블이 존재하는 객체이기 때문에 2차원 numpy ndarray로 DataFrame을 작성할시 위 예제와 완벽하게 동일하게 작동하지는 않는다.




 ⑤ 튜플의 딕셔너리

사용자는 튜플 딕셔너리를 입력하여 자동으로 MulitIndex가 된 프레임을 생성할 수 있다.


튜플 딕셔너리에서의 DataFrame 생성 예)

# pandas의 import

In[2]: import pandas as pd

...

# 딕셔너리로 구성된 리스트로부터의 DataFrame 생성 

In[29]: dataframe5=pd.DataFrame({('a', 'a0'): {('A','A0'):0.0, ('A','A1'):1.0, ('A','A2'):2.0,},

                         ('a', 'a1'): {('A','A0'):3.0, ('A','A1'):4.0, ('A','A2'):5.0,},

                         ('a', 'a2'): {('A','A0'):6.0, ('A','A1'):7.0, ('A','A2'):8.0,},

                         ('b', 'b0'): {('A','A0'):0.0, ('A','A1'):1.0, ('A','A2'):2.0,},

                         ('b', 'b1'): {('A','A0'):3.0, ('A','A1'):4.0, ('A','A2'):5.0,},

                         ('b', 'b2'): {('A','A0'):6.0, ('A','A1'):7.0, ('A','A2'):8.0,}

                         })

In[30]: dataframe5

Out[30]: 

        a              b          

       a0   a1   a2   b0   b1   b2

A A0  0.0  3.0  6.0  0.0  3.0  6.0

  A1  1.0  4.0  7.0  1.0  4.0  7.0

  A2  2.0  5.0  8.0  2.0  5.0  8.0



 ⑥ 하나의 Series

Series를 입력으로 사용하는 경우 같은 인덱스를 사용하는 DataFrame이 된다.

그리고 열의 레이블은 기존 Series의 name 어트리뷰트에 저장된 이름을 따라간다. (columns 이름이 따로 입력되지 않은 경우)


Series에서의 DataFrame 생성 예)

# pandas의 import

In[2]: import pandas as pd

...

# 딕셔너리로 구성된 리스트로부터의 DataFrame 생성 

In[31]: dataframe6=pd.DataFrame(pd.Series([1,2,3], name='good'))

In[32]: dataframe6

Out[32]: 

   good

0     1

1     2

2     3




 DataFrame() 함수 세부 입력 사항


DataFrame() 함수의 세부 입력 사항에 대한 설명은 다음과 같다.



 DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)


data: ndarray, iterable, dict, 혹은 DataFrame

입력받는 딕셔너리의 값(value)에는 Series, array, constants, 혹은 list-like 객체로 존재해도 된다.


23.0버전 이후

만약 data가 하나의 dict일 경우, 열에서 데이터의 순서는 딕셔너리의 키(key) 순서를 따른다.

25.0버전 이후

data가 dicts로 구성된 list일 경우, 열에서 데이터의 순서는 리스트에 있던 순서를 따른다.



index: array-like 혹은 index 

결과로 출력되는 frame을 사용하기 위한 인덱스이다.

index값이 입력되지 않을 경우에 인덱스의 기본값으로 Rangeindex(0, 1, 2, 3, ...)가 입력된다.



columns: array-like 혹은 index 

결과로 출력되는 frame을 사용하기 위한 열의 라벨을 입력받는다.

columns값이 입력되지 않을 경우에 열 라벨의 기본값으로 Rangeindex(0, 1, 2, 3, ...)가 입력된다.



dtype: dtype

선택적으로 입력 가능하다. 

DataFrame에 입력될 자료형을 의미한다. 

오직 하나의 dtype만이 사용될 수 있다.

만약 명시하지 않을 경우 data 값의 자료형을 참고하여 자동으로 입력한다.



copy: bool

입력되는 data로부터 데이터를 복사한다. 

오직 DataFrame이나 2d ndarray 입력만 영향을 미친다.



 

 

 

 

 참고자료

  https://pandas.pydata.org/pandas-docs/stable/getting_started/dsintro.html

  https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html

 

 

 

 


반응형

댓글