[데이터과학] Pandas Dataframe
판다스의 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 파일에서 데이터 읽어오기
df = pd.read_csv('dataset.csv')
# 데이터 프레임 생성, CSV 파일의 첫번째 행은 열의 이름으로 사용된다.
df = pd.read_csv('dataset.csv', index_col=0)
# 명시적으로 첫번째 열을 데이터프레임의 인덱스로 사용한다.
데이터 프레임을 CSV 파일로 만들기
df.to_csv('output.csv', index=False)
만약 인덱스를 파일에 저장하고 싶지 않다면 저장 함수에 index=False 옵션을 추가해야 한다.
이렇게 하면 파일에 인덱스가 저장되지 않고, 데이터만 저장된다.