본문 바로가기
프로그래밍 언어

Python pandas - Series/DataFrame PDS

by 내기록 2023. 1. 27.
반응형

 

Pandas Data Structure

Pandas library는 주로 숫자에 특화된 Numpy에 비해 더 일반적으로 다양한 data type을 다룰 수 있는 tool입니다.

 

Series형 Pandas Data Structure(PDS)

pd.Series() class 생성자에 입력 인자로 Python list나 dictionary를 넣어 실행시켜 instance(class)를 만듭니다.

>> import pandas as pd;
>> ds1 = pd.Series([4, 2, 1])
>> ds1


0    4
1    2
2    1
dtype: int64

 

>> ds1.values
array([4, 2, 1])

>> ds1.index
RangeIndex(start=0, stop=3, step=1)

indexing 방법은 Numpy와 비슷하지만 (링크), 완전히 동일하지는 않다. 예를 들어, index를 -1로 해서 마지막 요소를 찾을 수는 없다.

>> ds1[[0,2]]
0    4
2    1
dtype: int64

>> ds1[-1] (X)

 

- 변경/추가

>> ds1[2] = -1; ds1 # idx 2번 value 변경
0    4
1    2
2   -1
dtype: int64

>> ds1[4] = 3.; ds1 # idx 4번 추가
0    4.0
1    2.0
2   -1.0
4    3.0
dtype: float64

두 번째 예에서 새로운 요소를 실수형으로 추가하면 모든 요소들의 type이 float64로 변경되는 것을 알 수 있다. 모든 요소들이 숫자인 series pds에서는 어떤 조건을 만족시키는 요소들만 골라내거나 일률적인 산술 연산을 하기가 매우 쉽다.

>> ds1[ds1>2]
0    4.0
4    3.0
dtype: float64

모든 요소들이 다 실수인 series pds는 NumPy 함수를 사용하는 산술적 연산도 가능합니다.

아래는 ds1의 모든 요소들에 대한 지수함수값을 구하기 위해 np 함수를 사용합니다.

>> np.exp(ds1)
0    54.598150
1     7.389056
2     0.367879
4    20.085537
dtype: float64

 

default로 들어가는 index array가 아닌 다른 index array를 넣을 수도 있습니다.

>> ds2 = pd.Series([4, 2, -1, 3], index=['b', 'c', 'a', 'd']); ds2
b    4
c    2
a   -1
d    3
dtype: int64

 

dictionary도 중첩 구조가 아니며 모든 Key에 대한 value 요소들의 개수가 동일하다면 series pds로 변환할 수 있습니다.

>> dic1 = {'2015': [36, -15.5], '2016':[36.6, -15], '2017':[35.4, -14]}; dic1
>> ds3 = pd.Series(dic1); ds3
2015    [36, -15.5]
2016    [36.6, -15]
2017    [35.4, -14]
dtype: object

 

DataFrame형 Pandas Data Structure(PDS)

daataframe-pds는 여러 개의 column으로 구성된 표와 비슷하며, 각 column별 type을 다르게 할 수 있습니다.

구성하는 방법은 총 세 가지 입니다.

 

첫 번째 방법)

value를 np.array()의 입력인자로 넣고, column label로 구성된 list를 만든 다음 DataFrame() class 생성자를 사용해서 instance(class)를 생성합니다.

참고로, series 형과 dataframe형 모두 pds를 ndarray로 바꾸고 싶다면 .to_numpy() method를 사용하면 됩니다.

>> npa1 = df1.to_numpy();

 

 

두 번째 방법) dictionary를 DataFrame() class 생성자에 입력인자로 넣는다.

dic2 = {'Name': ['Tom','Judy','Fred'],
       'State': ['NY','CA','PA'],
       'Age': [45,36,21],
       'Gender': ['M','F','M']}
       
df2 = pd.DataFrame(dic2); df2

 

참고로, row index를 지정하려면 index 인자 값으로 넣어주면 됩니다.

df2 = pd.DataFrame(dic2, index=[1,2,3]); df2

 

세 번째 방법) nested dictinary를 사용한다.

dic3 = {'Name': {11:'Tom', 12:'Judy', 13:'Fred'},
       'State': {11:'NY', 12:'CA', 13:'PA'},
       'Age': {11:45, 12:36, 13:21},
       'Gender': {11:'M', 12:'F', 13:'M'}}
       
df3 = pd.DataFrame(dic3)

 

 


dataframe-psd에는 .value/.column/.index 속성과 index와 column label을 함께 볼 수 있는 .axes 속성이 있습니다.

>> df3.values
array([['Tom', 'NY', 45, 'M'],
       ['Judy', 'CA', 36, 'F'],
       ['Fred', 'PA', 21, 'M']], dtype=object)

>> df3.columns
['Name', 'State', 'Age', 'Gender']

>> list(df3.index)
[11, 12, 13]

>> df3.axes
[Int64Index([11, 12, 13], dtype='int64'),
 Index(['Name', 'State', 'Age', 'Gender'], dtype='object')]

 

 

 

References

Python(파이썬)과 Matplotlib, Numpy, Pandas - 양원영, 고병천 외 3명 

 

 

반응형

댓글