CSE/Data Science

[데이터과학] Pandas Dataframe

minkylee 2024. 4. 24. 14:50

판다스의 Dataframe은 다음과 같은 인수를 가진다.

 

pandas.DataFrame(data, index , columns , dtype , copy )

 

  • Data : ndarray, series, map, lists, dict, 상수 및 다른 Dataframe까지 올 수 있다.
  • index : 결과 프레임에 사용할 행 레이블, 입력하지 않은 경우 기본값으로 np.arrange(n) 값이 온다.
  • columns : 행 레이블, 기본값은 np.arrange(n)이다. 
  • dtype : 행 레이블의 데이터 타입
  • copy : 데이터를 복사할 때 쓴다. 기본값은 False

Serise를 사용해서 Dataframe 만들기

 

시리즈 객체를 만든다.

import datetime as dt
import numpy as np
import pandas as pd

 

시리즈 객체를 가지고 데이터 프레임을 만든다.

np.random.seed(0) # set a seed for reproducibility
s = pd.Series(np.random.rand(5), index=["a", "b", "c", "d", "e"])
s


# 결과

a    0.548814
b    0.715189
c    0.602763
d    0.544883
e    0.423655
dtype: float64
  • np.linspace(0, 10, num=5)는 0부터 10까지의 범위에서 균등하게 5개의 숫자를 생성한다.

생성된 시리즈를 pandas 데이터 프레임으로 변경한다. 

 

pd.Series(np.linspace(0, 10, num=5)).to_frame()

 

Dictionary 를 가지고 Dataframe 만들기

 

data = {'apples':[3, 2, 0, 1], 'oranges':[0, 3, 7, 2]}
df = pd.DataFrame(data)
df

 

 

pandas DataFrame 컨스트럭터에 전달한다.

 

각각의 (key, value)는Dataframe의 열에 해당된다.

 

이 데이터 프레임의 인덱스는 0-3의 숫자로 주어진다. 하지만 DataFrame을 초기화 할 때 자체적으로 생성할 수도 있다.

 

np.random.seed(0) # 난수 생성기 초기화
pd.DataFrame(
  {
  'random': np.random.rand(5), # 0과 1사이의 균일 분포를 따르는 5개의 난수
  'text': ['hot', 'warm', 'cool', 'cold', None],
  'truth': [np.random.choice([True, False]) for _ in range(5)] # true와 false값을 무작위로 선택
  },
index=pd.date_range( # 지정된 기간동안의 날짜 생성
  end=dt.date(2019, 4, 21),
  freq='1D',
  periods=5,
  name='date'
  ) # 1일 간격으로 총 5개의 날짜를 생성
)

 

결과 :

 

 

 

 

pandas.DataFrame.from_dict

pandas.DataFrame.from_dict(data, orient='columns', dtype=None, columns=None)

 

  • data : 형태는 {필드 : 유사 배열} 또는 {필드 : 딕셔너리}이다. 데이터 프레임을 생성할 때 데이터를 딕셔너리 형태로 저장
  • orient : {columns, index}, 기본값 'columns'
    • 데이터의 방향을 의미한다.
    • 전달된 딕셔너리의 키가 데이터프레임의 열이 되어야 한다면 columns를 사용한다.
    • 키가 행이 되어야 한다면 index를 사용한다. 
  • dtype : dtype, 기본값 : None
    • 강제로 적용할 데이터 타입. 지정하지 않으면 데이터 유형은 자동으로 추론된다.
  • columns : 리스트, 기본값 None
    • orient=index 일 때 사용할 열 레이블
    • orient=column일 때 함께 사용되면 ValueError를 발생시킨다.

 

DataFrame을 만드는 더 많은 방법이 있다.

 

Dictionary의 리스트로 Dataframe 만들기

pd.DataFrame([
    {'mag': 5.2, 'place': 'California'},
    {'mag': 1.2, 'place': 'Alaska'},
    {'mag': 0.2, 'place': 'California'},
])

# 결과


mag	place
0	5.2	California
1	1.2	Alaska
2	0.2	California

 

Tuple의 리스트로 Dataframe 만들기

list_of_tuples = [(n, n**2, n**3) for n in range(5)] # 각 n에 대해 n의 제곱, n의 세제곱 생성
list_of_tuples

pd.DataFrame(
  list_of_tuples,
  columns=['n', 'n_squared', 'n_cubed'] # 열 이름 지정
)

 

결과

  n  n_squared  n_cubed
0  0         0        0
1  1         1        1
2  2         4        8
3  3         9       27
4  4        16       64

 

Pandas의 orient 키워드

데이터를 데이터프레임으로 변환할 때 데이터의 방향성을 지정하는 데 사용된다.

 

데이터가 어떤 방식으로 조직될지를 결정하는 중요한 옵션

 

주로 딕셔너리 데이터를 데이터프레임으로 변환할 때 사용된다.

 

1. orient='columns' (default)

이 옵션을 사용하면 딕셔너리의 키가 데이터프레임의 열 이름으로 사용된다.

각 키에 대응하는 값은 해당 열의 데이터로 사용된다.

이 경우 딕셔너리의 값은 열에 대한 데이터를 포함해야 하며, 일반적으로 각 키에 대한 값은 하위 딕셔너리가 된다.

 

예시 :

  • 예를 들어, {'A': [1, 2], 'B': [3, 4]}와 같은 딕셔너리가 있을 때, 'A'와 'B'는 열 이름이 되고, 이 열에는 각각 [1, 2]와 [3, 4]가 들어간다.

2. 'orient=index'

이 옵션을 사용하면 딕셔너리의 키가 데이터 프레임의 행 인덱스로 사용된다.

각 키에 대응하는 값은 그 행의 데이터로 사용된다.

이 경우 딕셔너리의 값은 열에 대한 데이터를 포함해야 하며, 일반적으로 각 키에 대한 값은 하위 딕셔너리가 된다.

 

예시 :

  • {'row1': {'A': 1, 'B': 2}, 'row2': {'A': 3, 'B': 4}}에서 'row1'과 'row2'는 행 인덱스가 되고, 'A'와 'B'는 열 이름이 된다.

 

 

# orient='column'인 경우 = 기본값

data = {'col_1':[3, 2, 1, 0], 'col_2':['a','b','c','d']}
pd.DataFrame.from_dict(data)

# 결과

	col_1	col_2
0	3	a
1	2	b
2	1	c
3	0	d

 

 

 

# orient='index'의 경우

data = {'row_1':[3, 2, 1, 0], 'row_2':['a','b','c','d']}
pd.DataFrame.from_dict(data,
						orient='index')
                        
# 결과


	0	1	2	3
row_1	3	2	1	0
row_2	a	b	c	d

 

 

# orient='index'를 주고 다로 column을 지정해 준 경우
data = {'row_1':[3, 2, 1, 0], 'row_2':['a','b','c','d']}
pd.DataFrame.from_dict(data,
                        orient = 'index',
                        columns = ['A','B','C','D'])


# 결과


	A	B	C	D
row_1	3	2	1	0
row_2	a	b	c	d

 

 

파일에서 Dataframe 로드하기

 

CSV 파일에서 데이터 읽어오기

 

CSV 파일
이 코드를 통해 구글 코랩에 불러올 수 있다.

 

df = pd.read_csv('dataset.csv')
# 데이터 프레임 생성, CSV 파일의 첫번째 행은 열의 이름으로 사용된다.
df = pd.read_csv('dataset.csv', index_col=0)
# 명시적으로 첫번째 열을 데이터프레임의 인덱스로 사용한다.

index_col 옵션을 주지 않았을 때

 

index_col 옵션을 주었을 때

 

데이터 프레임을 CSV 파일로 만들기

df.to_csv('output.csv', index=False)

 

 

만약 인덱스를 파일에 저장하고 싶지 않다면 저장 함수에 index=False 옵션을 추가해야 한다.

이렇게 하면 파일에 인덱스가 저장되지 않고, 데이터만 저장된다.