목차
판다스 데이터 구조
우리에게 가장 친숙한 데이터 구조는 엑셀이거나 개발자의 경우 SQL 테이블일 것이다.
판다스는 2차원 행과 열(행렬)로 이루어진 데이터 구조를 데이터프레임(DataFrame)으로 제공한다. 이러한 데이터프레임은 판다스에서 가장 많이 사용하는 객체이며, 파이썬으로 데이터 분석을 할 때 필수적인 도구이다.
밑에 사진은 판다스 치트시트인데 해당 시트만 공부해도 데이터프레임을 사용한 데이터 전처리에 많은 도움이 된다.
시리즈와 데이터프레임
시리즈
시리즈(Series)는 모든 데이터 유형(정수, 문자열, 부동 소수점 숫자, 객체 등)을 저장할 수 있는 1차원 레이블이 지정된 배열이다.
1차원 레이블이란 시리즈(Series)에서 각 데이터 요소(원소)들에 붙는 인덱스(위치)를 의미합니다. |
시리즈 구조 | |
동물(이름) | |
0(인덱스) | Cat(값) |
1 | Dog |
2 | Monkey |
시리즈는 딕셔너리, 리스트, 튜플 등을 사용해 만들 수 있고 인덱스와 쌍으로 이루어진 데이터로 구성이 된다.
"""리스트로 만들기"""
import pandas as pd
data = pd.Series(['Cat', 'Dog', 'Monkey'], ['0', '1', '2'])
print()
print(data)
print()
------------------------
0 Cat
1 Dog
2 Monkey
dtype: object
"""딕셔너리로 만들기"""
import pandas as pd
# 딕셔너리 생성
data = {'0': 'Cat', '1': 'Dog', '2': 'Monkey'}
# Series 객체 생성
sd = pd.Series(data)
# 출력
print()
print(sd)
print()
-----------------------
0 Cat
1 Dog
2 Monkey
dtype: object
"""튜플로 만들기"""
import pandas as pd
# 튜플 생성
data = ('Cat', 'Dog', 'Monkey')
index = ('0', '1', '2')
# Series 객체 생성
sd = pd.Series(data, index=index)
# 출력
print()
print(sd)
print()
--------------------
0 Cat
1 Dog
2 Monkey
dtype: object
이렇게 어떤 방식을 사용해도 큰 차이가 전혀 없다.
데이터프레임
데이터프레임은 엑셀의 스프레드시트와 같은 형태인 행과 열 자료 구조입니다. 각 열에서는 서로 다른 종류의 값(숫자, 문자열 등)을 가질 수 있고 위에 보았던 시리즈가 여러 개 합쳐진 것이 데이터프레임이라고 보면 된다.
데이터프레임 구조 | ||
동물 | 나이 | |
0(인덱스) | Cat(값) | 5(값) |
1 | Dog | 4 |
2 | Monkey | 3 |
데이터프레임을 딕셔너리와 리스트로 만드는 것의 차이점은 딕셔너리로 만들면 데이터프레임의 열을 하나씩 쌓아가는 형태이고, 리스트로 만들면 행을 하나씩 쌓아가는 형태로 이해하면 된다.
"""딕셔너리로 데이터프레임 만들기"""
import pandas as pd
# 딕셔너리 생성
data_dict = {
'이름': ['홍길동', '김철수', '이영희'],
'나이': [30, 25, 35],
'성별': ['남', '남', '여']
}
# 데이터프레임 생성
df_dict = pd.DataFrame(data_dict)
# 출력
print("딕셔너리로 만든 데이터프레임:")
print(df_dict)
---------------------------
딕셔너리로 만든 데이터프레임:
이름 나이 성별
0 홍길동 30 남
1 김철수 25 남
2 이영희 35 여
딕셔너리로 데이터프레임 생성 과정:
- data_dict는 열 이름('이름', '나이', '성별')을 키로, 각 열의 데이터를 값으로 가지고 있습니다.
- pd.DataFrame(data_dict)를 사용하여 딕셔너리를 데이터프레임으로 변환합니다. Pandas는 이 데이터를 열 단위로 쌓아 데이터프레임을 생성합니다.
"""리스트로 데이터프레임 만들기"""
import pandas as pd
# 리스트 생성
data_list = [
['홍길동', 30, '남'],
['김철수', 25, '남'],
['이영희', 35, '여']
]
# 열 레이블 정의
columns = ['이름', '나이', '성별']
# 데이터프레임 생성
df_list = pd.DataFrame(data_list, columns=columns)
# 출력
print("리스트로 만든 데이터프레임:")
print(df_list)
----------------------------
리스트로 만든 데이터프레임:
이름 나이 성별
0 홍길동 30 남
1 김철수 25 남
2 이영희 35 여
리스트로 데이터프레임 생성 과정:
- data_list는 각 행의 데이터를 리스트로 묶어서 저장하고 있습니다.
- columns 리스트는 각 열의 이름을 정의하여 열 레이블로 사용됩니다.
- pd.DataFrame(data_list, columns=columns)를 사용하여 리스트와 열 레이블을 기반으로 데이터프레임을 생성합니다. 각 리스트의 요소들은 행 단위로 추가되어 데이터프레임을 구성합니다.
데이터프레임 조작
빅데이터 분석과 머신러닝 모델을 구축할 때 주어진 데이터를 바로 사용하는 경우는 드물고 원하는 형태로 변환하여 사용하는 경우가 대부분이다. 앞서 말한 것은 데이터를 가공하는 것을 말한 것인데 데이터를 가공하는 과정을 데이터 전처리나 데이터 조작이라고 한다.
하지만 데이터를 가공하는 과정인 데이터 전처리는 빅데이터 분석을 할 때 가장 많은 시간이 걸리는 과정이기도 하다. 왜냐? 해보면 알 것이다.
데이터프레임 행과 열
데이터베이스는 판다스의 데이터프레임과 같은 구조인 행과 열로 이루어지는데 분야에 따라 같은 의미이지만 다양한 명칭으로 불린다.
Name | Sex | Age | Grade |
홍길동 | 남자 | 22 | 2 |
나미란 | 여자 | 23 | 3 |
변수
열, 칼럼, 피처, 특징 -> 이름, 설별, 나이, 학년
Name | Sex | Age | Grade |
관측치
행, 로우, 데이터 -> 값을 측정한 단위, 각각의 사람
홍길동 | 남자 | 22 | 2 |
나미란 | 여자 | 23 | 3 |
값
각 값 -> 22, 2 등등
홍길동 | 남자 | 22 | 2 |
나미란 | 여자 | 23 | 3 |
보기 좋은 데이터
깔끔한 데이터(Tidy data)
깔끔한 데이터 | 지저분한 데이터 | |||||
NO | 변수 | 값 | NO | 수학_점수 | 영어_점수 | |
홍길동 | 수학 | 85 | 홍길동 | 85 | 88 | |
홍길동 | 영어 | 88 | 김철수 | 99 | 99 | |
김철수 | 수학 | 99 | ||||
김철수 | 영어 | 99 |
데이터프레임 확인
tips 데이터를 사용해서 요약 정보를 보자
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips)
print(tips.info())
------------------------------
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
.. ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3
240 27.18 2.00 Female Yes Sat Dinner 2
241 22.67 2.00 Male Yes Sat Dinner 2
242 17.82 1.75 Male No Sat Dinner 2
243 18.78 3.00 Female No Thur Dinner 2
[244 rows x 7 columns]
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 244 entries, 0 to 243
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 total_bill 244 non-null float64
1 tip 244 non-null float64
2 sex 244 non-null category
3 smoker 244 non-null category
4 day 244 non-null category
5 time 244 non-null category
6 size 244 non-null int64
dtypes: category(4), float64(2), int64(1)
memory usage: 7.4 KB
위의 코드를 보면 알 수 있듯이 tips 데이터는 244개의 행과 7개의 열에 관한 정보가 있고 Info 함수로 클래스 유형, 행 인덱스의 구성, 열 이름의 종류와 개수, 각 열의 자료형과 개수, 메모리 할당량에 관한 정보를 볼 수 있다.
""" 데이터프레임에서 상위 5개 데이터 추출"""
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips.head())
----------------------------
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
""" 데이터프레임에서 상위 10개 데이터 추출"""
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips.head())
----------------------------
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
5 25.29 4.71 Male No Sun Dinner 4
6 8.77 2.00 Male No Sun Dinner 2
7 26.88 3.12 Male No Sun Dinner 4
8 15.04 1.96 Male No Sun Dinner 2
9 14.78 3.23 Male No Sun Dinner 2
""" 하위 데이터 5개 추출 """
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips.tail())
------------------------------------------
total_bill tip sex smoker day time size
239 29.03 5.92 Male No Sat Dinner 3
240 27.18 2.00 Female Yes Sat Dinner 2
241 22.67 2.00 Male Yes Sat Dinner 2
242 17.82 1.75 Male No Sat Dinner 2
243 18.78 3.00 Female No Thur Dinner 2
""" 하위 데이터 7개 추출 """
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips.tail())
------------------------------------------
total_bill tip sex smoker day time size
237 32.83 1.17 Male Yes Sat Dinner 2
238 35.83 4.67 Female No Sat Dinner 3
239 29.03 5.92 Male No Sat Dinner 3
240 27.18 2.00 Female Yes Sat Dinner 2
241 22.67 2.00 Male Yes Sat Dinner 2
242 17.82 1.75 Male No Sat Dinner 2
243 18.78 3.00 Female No Thur Dinner 2
행 데이터
데이터를 행 단위로 가져와보자.
속성 | 설명 | 대상 |
loc | 인덱스를 기준으로 행 데이터 읽기 | 인덱스 이름 ex) ["A" : "C"] -> "A", "B", "C" |
iloc | 행 번호를 기준으로 행 데이터 읽기 | 정수 위치 인덱스 ex) [1 : 3] -> 1, 2 |
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips.head(6))
print()
print(tips.loc[3])
print()
print(tips.iloc[5])
---------------------------
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
5 25.29 4.71 Male No Sun Dinner 4
total_bill 23.68
tip 3.31
sex Male
smoker No
day Sun
time Dinner
size 2
Name: 3, dtype: object
total_bill 25.29
tip 4.71
sex Male
smoker No
day Sun
time Dinner
size 4
Name: 5, dtype: object
"""여러 인덱스 가져오기"""
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips.head(6))
print()
print(tips.loc[[1, 3, 5]])
---------------------------------
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
5 25.29 4.71 Male No Sun Dinner 4
total_bill tip sex smoker day time size
1 10.34 1.66 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
5 25.29 4.71 Male No Sun Dinner 4
"""특정 범위 행 데이터 가져오기"""
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips[0:4])
print()
print(tips.loc[0:4])
print()
print(tips.iloc[0:4])
----------------------------------------------
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
"""특정 범위 인덱스의 컬럼 가져오기"""
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips[0:3])
print()
print(tips.loc[0 : 3, ["total_bill", "day"]])
-----------------------------------------------
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
total_bill day
0 16.99 Sun
1 10.34 Sun
2 21.01 Sun
3 23.68 Sun
"""특정 인덱스 값과 특정 컬럼에 있는 값 가져오기"""
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips[0:3])
print()
print(tips.loc[0,["sex"]])
---------------------------------
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
sex Female
Name: 0, dtype: object
"""행과 열 동시에 지정해서 원하는 부분의 데이터 가져오기"""
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips.head(5))
print()
print(tips.iloc[1:3, 0:2])
---------------------------------------------------------
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
total_bill tip
1 10.34 1.66
2 21.01 3.50
"""인덱스 기준으로 행, 열을 지정"""
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips.head(5))
print()
print(tips.iloc[[1,2,4], [0,2]])
------------------------------------
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
total_bill sex
1 10.34 Male
2 21.01 Male
4 24.59 Female
"""명시적으로 행 또는 열 전체 가져오기"""
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips.head(5))
print()
print(tips.iloc[1:3, :])
print()
print(tips.iloc[:, 1:3])
----------------------------------------
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
total_bill tip sex smoker day time size
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
tip sex
0 1.01 Female
1 1.66 Male
2 3.50 Male
3 3.31 Male
4 3.61 Female
.. ... ...
239 5.92 Male
240 2.00 Female
241 2.00 Male
242 1.75 Male
243 3.00 Female
[244 rows x 2 columns]
"""조건을 주어 선택하기"""
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips.tip > 3)
----------------------------
0 False
1 False
2 True
3 True
4 True
...
239 True
240 False
241 False
242 False
243 False
Name: tip, Length: 244, dtype: bool
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
# Female이면서 smoker인 경우 필터링
tips[(tips["sex"] == "Female") & (tips["smoker"] == "Yes")]
print( tips[(tips["sex"] == "Female") & (tips["smoker"] == "Yes")] )
---------------------------------------------------------------------
total_bill tip sex smoker day time size
67 3.07 1.00 Female Yes Sat Dinner 1
72 26.86 3.14 Female Yes Sat Dinner 2
73 25.28 5.00 Female Yes Sat Dinner 2
92 5.75 1.00 Female Yes Fri Dinner 2
93 16.32 4.30 Female Yes Fri Dinner 2
100 11.35 2.50 Female Yes Fri Dinner 2
101 15.38 3.00 Female Yes Fri Dinner 2
102 44.30 2.50 Female Yes Sat Dinner 3
103 22.42 3.48 Female Yes Sat Dinner 2
109 14.31 4.00 Female Yes Sat Dinner 2
164 17.51 3.00 Female Yes Sun Dinner 2
168 10.59 1.61 Female Yes Sat Dinner 2
169 10.63 2.00 Female Yes Sat Dinner 2
178 9.60 4.00 Female Yes Sun Dinner 2
186 20.90 3.50 Female Yes Sun Dinner 3
188 18.15 3.50 Female Yes Sun Dinner 3
191 19.81 4.19 Female Yes Thur Lunch 2
197 43.11 5.00 Female Yes Thur Lunch 4
198 13.00 2.00 Female Yes Thur Lunch 2
201 12.74 2.01 Female Yes Thur Lunch 2
202 13.00 2.00 Female Yes Thur Lunch 2
203 16.40 2.50 Female Yes Thur Lunch 2
205 16.47 3.23 Female Yes Thur Lunch 3
209 12.76 2.23 Female Yes Sat Dinner 2
213 13.27 2.50 Female Yes Sat Dinner 2
214 28.17 6.50 Female Yes Sat Dinner 3
215 12.90 1.10 Female Yes Sat Dinner 2
219 30.14 3.09 Female Yes Sat Dinner 4
221 13.42 3.48 Female Yes Fri Lunch 2
225 16.27 2.50 Female Yes Fri Lunch 2
226 10.09 2.00 Female Yes Fri Lunch 2
229 22.12 2.88 Female Yes Sat Dinner 2
240 27.18 2.00 Female Yes Sat Dinner 2
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
# 일요일인 경우 필터링
sunday_tips = tips[tips["day"].isin(["Sun"])]
print("일요일인 경우 데이터:")
print(sunday_tips.head()) # 일부 데이터만 출력
# 팁을 3달러 지불한 고객 필터링
tips_3_dollars = tips[tips["tip"].isin([3])]
print("\n팁을 3달러 지불한 고객 데이터:")
print(tips_3_dollars.head()) # 일부 데이터만 출력
------------------------------------------------
일요일인 경우 데이터:
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
팁을 3달러 지불한 고객 데이터:
total_bill tip sex smoker day time size
13 18.43 3.0 Male No Sun Dinner 4
29 19.65 3.0 Female No Sat Dinner 2
32 15.06 3.0 Female No Sat Dinner 2
45 18.29 3.0 Male No Sun Dinner 2
49 18.04 3.0 Male No Sun Dinner 2
열 변수
데이터프레임의 각 칼럼들은 각기 특별한 자료형을 갖고 있습니다. 이러한 속성들을 확인해 봅시다.
파이썬의 기본적인 소수점은 float64로, 기본적인 문자열은 string(str)이 아니라 object라는 자료형을 가지고 있습니다. 그리고 열 변수 형식은 시리즈 형식입니다.
데이터 조작
메서드 | 기능 |
df.count() | 개수 확인 |
df.index df.columns df.values |
인덱스 보기 변수 보기 데이터 보기 |
df.sort_values() df.sort_values(ascending=False) |
오름차순 내림차순 |
df.sum() | 행, 열 합계 |
데이터 행의 개수를 세는 방법으로 count함수를 사용한다.
데이터프레임 | 시리즈 | |
행 개수 세기 | len(df) df.shape[0] len(df.index) |
len(s) s.size len(s.index) |
열 개수 세기 | df.shape[0] | N/A |
null 제외한 행 개수 | df.count() | s.cout() |
그룹별 행 개수 | df.groupby(...).count() | sgroupby(...).size() |
그룹별 null 제외한 행 개수 | df.groupby(...).count() | s.groupby(...).count() |
데이터 연결과 병합
판다스는 두 개 이상의 데이터프레임을 하나로 결합하는 방식으로 데이터 연결과 병합을 지원한다.
데이터 연결
연결은 데이터 행을 위, 아래 또는 좌우로 결합하는 방식을 말하는데 데이터 행을 연결하는 과정을 통해 간단히 두 시리즈나 데이터프레임을 연결할 수 있지만 이 경우 인덱스 값이 중복될 수 있다. concat 메서드를 사용하면 기준 열(key column) 없이 데이터를 연결할 수 있다.
데이터 병합
병합은 두 데이터프레임의 공통되는 열 또는 인덱스를 기준으로 두 개의 테이블을 합치는 과정이다.
이때 기준이 되는 열, 행의 데이터를 키(key)라고 한다.
단일변수 데이터 보기
데이터 분석은 변수의 유형을 구분하는데 서부터 시작하는데, 우선 단일변수와 변수 유형에 따른 분석부터 해야 한다.
'Python > 빅데이터 분석과 머신러닝' 카테고리의 다른 글
#8 데이터 분석 (1) | 2024.07.23 |
---|---|
#7 데이터 시각화 (2) | 2024.07.18 |
#6 데이터 탐색 (0) | 2024.07.14 |
#5 데이터 클렌징 (1) | 2024.07.14 |
#3 데이터 준비 (1) | 2024.07.05 |