이전 포스팅에서 판다스 자료구조인 Series에 대해 알아보았다. 이번에는 DataFrame(데이터프레임)에 대해 알아보자.
시리즈가 엑셀의 한 열과 동일한 이해구조를 본다면, 데이터프레임은 그 열을 merge한 엑셀 시트라고 볼 수 있다.
컴퓨터 공학도에게는 DB를 알기에 데이터베이스와 동일하다고도 볼 수 있다.
DataFrame의 정의:
DataFrame(데이터프레임)은 numpy의 ndArray를 기반으로 한 행과 열로 이루어진 자료구조이다.
판다스 데이터프레임 속성은 다음과 같다.
데이터프레임 생성법부터 알아보자.
생성법은 크게 3가지가 있다. list를 이용한 생성, Dictionary를 이용한 생성, Series를 이용한 생성
각각 한번 알아보자.
list를 이용한 생성법.
이 list생성도 두가지로 분류 할 수 있다. 1자원 리스트와 멀티 리스트로 볼 수 있다.
-1차원 리스트
single_list=['a','b,','c','d']
df=pd.DataFrame(single_list)
df
0
0 a
1 b
2 c
3 d
본인도 데이터를 다루며 이런식의 데이터프레임은 잘 사용하지 않으므로 설명은 생략하겠다.
-멀티 리스트
multi_list=[['kwandoll',27],['suuuuuk',27],['heeeee',30]]
df=pd.DataFrame(multi_list)
df
0 1
0 kwandoll 27
1 suuuuuk 27
2 heeeee 30
위 리스트를 이용한 생성을 보면 칼럼들에 대한 변수명은 0 과 1이다. 만일 dimension을 늘리면 늘릴수록 칼럼명은 0,1,2,3,4~~~식으로 간다는 건데, 일반적으로 이해하는게 어렵다.
그렇기에, 카럼명을 지정해줘야 한다.
multi_list=[[['kwandoll',27],['suuuuuk',27]],[['heeeee',30]]]
df=pd.DataFrame(multi_list,columns=['name','age'])
df
name age
0 kwandoll 27
1 suuuuuk 27
2 heeeee 30
이러한 작업을 피하기 위해, 본인은 파이썬에 꽃인 Dictionary자료구조를 제일 많이 사용한다. 실제 데이터 분석을 할경우 같은 의미를 뽑아야하는 경우가 있으며, 데이터프레임 내에 처리가 안될 경우에는 value들을 직접 뽑아서 처리하고 DataFrame에 다시 저장하는 경우가 비일비재하다. 그러므로 이번에 설명하는 Dictionary를 이용한 생성을 유심히 보길 바란다.
Dictionary를 이용한 생성
딕셔너리 자료구조로 생성할때 두가지가 있다. 단순 Dictionary로 생성하기, Dictionary로 구성된 리스트로 생성하기.
우선 단순 Dictionary로 생성하는 법을 알아보자.
-단순 Dictionary로 생성
Dictionary.keys()는 column명을 생성하고, Dictionary.values()는 data역할을 한다.
단, 각 딕셔너리의 길이는 동일해야한다.
data={'lee':[1,2,3],'kwan':[2,3,4],'doll':[3,4,5]}
df=pd.DataFrame(data)
df
lee kwan doll
0 1 2 3
1 2 3 4
2 3 4 5
그럼 만일 dictionary.values()의 길이가 다르다면 어떨까
data={'lee':[1,2,3],'kwan':[2,3],'doll':[3,4,5]}
df=pd.DataFrame(data)
df
ValueError: arrays must all be same length
다음과같은 에러가 뜬다. 즉 이말은 values에 있는 리스트의 길이는 동일해야한다는 뜻이다.
다음은 Dictionary로 구성된 리스트로 생성하는 법을 알아보자.
-Dictionary로 구성된 리스트 생성
data=[{'lee':1,'kwan':2},{'lee':3,'doll':4},{'king':5,'laa':6}]
df=pd.DataFrame(data)
df
lee kwan doll king laa
0 1.0 2.0 NaN NaN NaN
1 3.0 NaN 4.0 NaN NaN
2 NaN NaN NaN 5.0 6.0
data=[]에 들어있는 리스트의 순서대로 각 인덱스가 인덱스로, 즉, dict1, dict2, dict3이 각각 0,1,2가 되는것이다.
또한 Dictionary.keys()는 column명으로, dictionary.values()는 data로 저장된다. 또한, 비어있는 부분은 모두 NaN값으로 처리한다.
여기서 만약 인덱스와 칼럼명을 지정해준다면 다음과 같이 변형된다.
data=[{'lee':1,'kwan':2},{'lee':3,'doll':4},{'king':5,'laa':6}]
df_1=pd.DataFrame(data,index=['zero','first','second'],columns=['lee','kwan','doll','king','laa'])
df_1
lee kwan doll king laa
zero 1.0 2.0 NaN NaN NaN
first 3.0 NaN 4.0 NaN NaN
second NaN NaN NaN 5.0 6.0
위 데이터에서 key인 'lee'는 value를 2개 갖고있다. 그러므로 이것이 데이터프레임으로 처리할때는 순서대로 저장되는 것이다.
마지막으로 Sereis를 이용한 생성을 살펴보자.
Series를 이용한 생성
앞선 포스트처럼 시리즈는 액셀의 한 열이다. 그렇다면? 병합한다는 개념을 생각해보자.
series 또한 생성할때 리스트로 생성하는 법과 딕셔너리로 생성하는 법이 있었다.
두가지를 각각 살펴보자.
-리스트로 생성된 Series를 이용한 생성
a=pd.Series([11,22,33],['a','b','c'])
b=pd.Series([44,55,66],['d','e','f'])
c=pd.Series([77,88,99],['i','j','k'])
df=pd.DataFrame([a,b,c])
df
a b c d e f i j k
0 11.0 22.0 33.0 NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN 44.0 55.0 66.0 NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN 77.0 88.0 99.0
어떤 형식인지 이해해보자. 각 시리즈는 이차원 리스트로 되어있으며, Data와 Column으로 구성되어있다.
즉 이것을 모두 병합하여 처리를한다면, 위 결고와 같이 각각의 Column명으로 구성된 abcdefijk와 각각의
데이터로 구성된 11,22,33,44,55,66,77,88,99로 된다.
만일 예를들어, a라는 칼럼이 중복되어 11,33으로 되어있다면, a칼럼의 0번째 인덱스는 11,1번째 인덱스는 33으로 되는 것이다.
-딕셔너리로 생성된 Series를 이용한 생성
example={'lee':pd.Series([85,180],['weight','height']),'park':pd.Series([52,168],['weight','height'])}
df=pd.DataFrame(example)
df
lee park
weight 85 52
height 180 168
위 코드를 살펴보면 'lee'라는 칼럼명에는 시리즈 첫번째 리스트에 있는 값들이 그 다음에 지정해놓은 인덱스로 각각 처리되어 저장되는 모습이다. 실제 이런 것들은 직접 코딩을 해보고 눈으로 확인을 해봐야한다.
지금까지 크게 3가지로 구성된 자료구조로 어떻게 데이터프레임을 만들지는 상황마다 다르며 각자 쓰는 방법마다 다르다. 그러므로 이 세가지를 잘 숙지하는 것도 데이터를 다루는 능력에 절반은 차지할것이라고 생각한다(개인적 생각).
'Data analysis > Pandas' 카테고리의 다른 글
pandas.DataFrame.apply (0) | 2021.03.16 |
---|---|
[Pandas] Series (0) | 2021.01.15 |
[Pandas] DataFrame 특정 칼럼 혹은 인덱스 선택 (0) | 2021.01.13 |
[Pandas] DataFrame(개념) (0) | 2021.01.13 |