달나라 노트

Python Pandas : Series와 DataFrame 본문

Python/Python Pandas

Python Pandas : Series와 DataFrame

CosmosProject 2020. 10. 29. 19:37
728x90
반응형

 

 

Python Pandas

Python에서 Pandas library는 아마 엑셀같은 형태의 데이터를 다루기 위해 가장 많이 사용되는 library중 하나가 아닐 까 싶네요.저도 pandas를 거의 필수적으로 사용하고있다보니 상당히 유용한 library인 것은 틀림없는 것 같습니다.

 

 

Pandas의 자료구조 : Series, DataFrame

Pandas에는 대표적으로 Series와 DataFrame이라는 두 가지의 자료구조가 존재합니다.

 import pandas as pd

 list_item = [1, 2, 3, 4] # Pandas의 Series가 될 list 선언
 se_item = pd.Series(list_item) # list를 이용하여 Series 생성
 print(se_item)
 print(type(se_item))
 
 - Output
 0    1
 1    2
 2    3
 3    4
 
 <class 'pandas.core.series.Series'>
  

위 예시는 4개의 요소를 가진 List를 이용하여 Series를 만들어 본 예시입니다.

 

결과를 봤을 때가장 왼쪽 컬럼(0, 1, 2, 3)은 row의 번호를 0부터 시작하는 숫자로 표시해주는 index 정보입니다.

 

즉, 이건 사실 컬럼 자체가 아니라 엑셀의 row 번호를 명시해주는 것과 같죠.그다음 두 번째 컬럼(1, 2, 3, 4)는 우리가 Series를 만들 때 사용했던 list에 들어있던 값입니다.

 

list에 있던 값들이 순서대로 Series로 만들어졌음을 알 수 있습니다.

import pandas as pd

dict_item = {
    'item_id': [1, 2, 3, 4],
    'item_name': ['a', 'b', 'c', 'd'],
    'price': [1000, 2000, 3000, 4000]
} # Pandas의 DataFrame의 재료가 될 dictionary 선언
df_item = pd.DataFrame(dict_item) # Dictionary를 이용하여 DataFrame 생성
print(df_item)
print(type(df_item))
 
 
 
 
 - Output
   item_id item_name  price
0        1         a   1000
1        2         b   2000
2        3         c   3000
3        4         d   4000

<class 'pandas.core.frame.DataFrame'>

DataFrame을 만들기 위해선 먼저 dictionary가 있어야 합니다.

 

위 예시의 결과를 보면dictionary의 key값들(item_id, item_name, price)은 DataFrame의 컬럼 명이 되었음을 알 수 있으며,

dictionary의 각 key에 할당된 list들은 DataFrame의 데이터가 되었음을 알 수 있습니다.

 

dictionary의 key값들 -> DataFrame의 컬럼명dictionary의 value값들 -> DataFrame에 있는 각 컬럼의 데이터들Series와 DataFrame의 차이라면 Series는 컬럼이 1개만 있는듯한 그림이지만

DataFrame은 컬럼이 2개 이상으로 많아질 수 있습니다.

 

반대로 이 둘의 공통점이라고하면 가장 왼쪽에 행(row)의 index를 나타내주는 번호가 생겼음을 알 수 있습니다.

 

 

 

 

 

 

import pandas as pd


list_test = [
    (1, 'Apple', 'a'),
    (2, 'Banana', 'b'),
    (3, 'Watermelon', 'c'),
    (4, 'Grape', 'd'),
    (5, 'Melon', 'e')
]

df_test = pd.DataFrame(list_test)
print(df_test)



-- Output
   0           1  2
0  1       Apple  a
1  2      Banana  b
2  3  Watermelon  c
3  4       Grape  d
4  5       Melon  e

<class 'pandas.core.frame.DataFrame'>

DataFrame은 위같은 형태의 데이터를 가지고도 만들 수 있습니다.

list_test를 보면 list 속에 여러 개의 tuple이 들어있는 형태이며, 각각의 tuple은 DataFrame에서 하나의 행에 대한 값을 가지고 있습니다.

 

그래서 만들어진 DataFrame을 보면 list_test의 데이터가 그대로 들어간걸 볼 수 있습니다.

 

다만 이렇게 DataFrame을 만들면 DataFrame의 컬럼 이름을 명시해주지 않았기 때문에 column 이름이 0, 1, 2로 매겨집니다.

 

 

 

 

 

import pandas as pd


list_test = [
    (1, 'Apple', 'a'),
    (2, 'Banana', 'b'),
    (3, 'Watermelon', 'c'),
    (4, 'Grape', 'd'),
    (5, 'Melon', 'e')
]

df_test = pd.DataFrame(list_test, columns=['col1', 'col2', 'col3'])
print(df_test)



-- Output
   col1        col2 col3
0     1       Apple    a
1     2      Banana    b
2     3  Watermelon    c
3     4       Grape    d
4     5       Melon    e

<class 'pandas.core.frame.DataFrame'>

컬럼 이름을 직접 지정하고싶으면 DataFrame의 columns 옵션에 컬럼 이름을 순서대로 담고있는 list를 전달하면 됩니다.

 

 

 

 

 

 

 

import pandas as pd

dict_item = {
    ('group1', 'item_id'): [1, 2, 3, 4],
    ('group1', 'item_name'): ['a', 'b', 'c', 'd'],
    ('group2', 'price'): [1000, 2000, 3000, 4000]
}
df_item = pd.DataFrame(dict_item)

print(df_item)
print(type(df_item))



-- Output
   group1           group2
  item_id item_name  price
0       1         a   1000
1       2         b   2000
2       3         c   3000
3       4         d   4000
<class 'pandas.core.frame.DataFrame'>

DataFrame을 만들 때 위처럼 dictionary의 key를 tuple의 형태로 묶어서 2개씩 전달하면

output DataFrame의 column index를 2줄(2차원)으로 만들 수 있습니다.

 

 

 

 

import pandas as pd

dict_item = {
    ('g1', 'group1', 'item_id'): [1, 2, 3, 4],
    ('g2', 'group1', 'item_name'): ['a', 'b', 'c', 'd'],
    ('g2', 'group2', 'price'): [1000, 2000, 3000, 4000]
}
df_item = pd.DataFrame(dict_item)
print(df_item)
print(type(df_item))




-- Output
       g1        g2       
   group1    group1 group2
  item_id item_name  price
0       1         a   1000
1       2         b   2000
2       3         c   3000
3       4         d   4000
<class 'pandas.core.frame.DataFrame'>

tuple에 3개의 요소를 전달하면 3줄(3차원)의 column index를 만드는 것도 가능합니다.

 

 

 

다만 여기서 주의해야할 것은 다차원 column index를 만들려면 반드시 tuple을 사용해야합니다.

아래 예시를 보면 item_id라는 컬럼은 tuple을 쓰지 않고 명시했기 때문에 결과 DataFrame에서도 column index가 tuple 그 자체로 생성되며 2차원 index가 생성되지 않습니다.

import pandas as pd

dict_item = {
    'item_id': [1, 2, 3, 4],
    ('group1', 'item_name'): ['a', 'b', 'c', 'd'],
    ('group2', 'price'): [1000, 2000, 3000, 4000]
}
df_item = pd.DataFrame(dict_item)
print(df_item)
print(type(df_item))




-- Output
   item_id (group1, item_name)  (group2, price)
0        1                   a             1000
1        2                   b             2000
2        3                   c             3000
3        4                   d             4000
<class 'pandas.core.frame.DataFrame'>

 

 

 

 

 

일단 dictionary key(DataFrame의 column 이름)를 모두 tuple로 입력해주면

tuple 속 요소 개수가 맞지 않아도 다차원 column index가 생성되며 부족한 부분은 NaN으로 column index가 생성되는 것을 볼 수 있습니다.

import pandas as pd

dict_item = {
    ('item_id',): [1, 2, 3, 4],
    ('group1', 'item_name'): ['a', 'b', 'c', 'd'],
    ('group2', 'price'): [1000, 2000, 3000, 4000]
}
df_item = pd.DataFrame(dict_item)
print(df_item)
print(type(df_item))





-- Output
  item_id    group1 group2
      NaN item_name  price
0       1         a   1000
1       2         b   2000
2       3         c   3000
3       4         d   4000
<class 'pandas.core.frame.DataFrame'>

 

 

 

 

 

 

728x90
반응형
Comments