데이터분석
(2) 데이터분석_Pandas
빠스무
2023. 6. 11. 20:36
728x90
1. 판다스(Pandas)
- '웨스 맥키니' 가 개발한 라이브러리
- 데이터 작업을 쉽고 직관적으로 할 수 있도록 설계된 빠르고 유연한 데이터 구조
판다스를 사용하기 위해 다운로드
!pip install pandas
판다스를 사용하기 위해 import를 시켜준다.
import pandas as pd
1-1. Series와 DataFrame
- 2차원 표 데이터를 데이터프레임이라고 한다면. 1차원 표데이터 시리즈다.
- 표의 데이터 부분을 values라고 부름
- 표의 행이름을 index라고 부름
- 표의 열이름을 columns라고 부름
- 시리즈는 values와 index로 이루어져 있고, 데이터 프레임은 values,index,columns로 이루어져 있음
- 데이터프레임과 시리즈는 value는 넘파이의 ndarray기반
data1 = [[67,93,91],[75,69,96],[75,81,82],[62,70,75],[98,45,87]]
idx1 = ['김사과','반하나','오렌지','이메론','배애리']
col1 = ['국어', '영어', '수학']
# DataFrame(데이터, 인덱스, 컬럼)
pd.DataFrame(data1)
pd.DataFrame(data1, idx1)
df1 = pd.DataFrame(data1, idx1, col1)
df1.values
df1.index
df1.columns
data2 =[67,75,75,62,98]
# Series(데이터, 인덱스)
pd.Series(data2)
pd.Series(data2, idx1)
se1 = pd.Series(data2, idx1)
se1.values
se1.index
# 딕셔너리를 사용하여 데이터프레임을 생성
dic1 = {
'국어': [67,75,75,62,98],
'영어': [93,69,81,70,45],
'수학': [91,96,82,75,87]
}
df2 = pd.DataFrame(data = dic1, index = idx1)
2. CSV 파일 다루기
- CSV(Comma Separeated Valued)의 약자로 데이터를 쉼표로 구분한 파일
- 엑셀로 로딩할 수 있지만 쉼표로 구분된 CSV가 더 가볍기 때문에 데이터로 많이 사용
- [공공데이터 포털]에서도 CSV 포멧의 파일을 제공
pd.read_csv('/content/drive/MyDrive/study/데이터분석/korean-idol.csv') # 경로를 이용해 csv파일을 읽어온다.
3. 엑셀파일 읽어오기
pd.read_excel('/content/drive/MyDrive/study/데이터분석/korean-idol.xlsx')
4. 데이터프레임 기본정보 알아보기
type(df)
# info(): 기본적인 행(row), 열(column)의 정보와
df.info()
4-1. 열(column) 다루기
4-2. 통계정보 알아보기
# describe() : 통계 정보를 출력
df.describe()
df.describe(include=object)
4-3. 형태(shape) 알아보기
df.shape
4-4. 원하는 개수의 데이터 보기
- head(): 상위 5개의 row를 출력
- head(n): 상위 n개의 row를 출력
- tail(): 하위 5개의 row를 출력
- tail(n): 하위 n개의 row를 출력
df.head()
df.tail()
4-5. 정렬하기
# index로 오름차순 정렬
df.sort_index(ascending=True)
# index로 내림차순 정렬
df.sort_index(ascending=False)
df.sort_values(by='height') # 키 순서로 정렬
# 값에 따른 내림차순 정렬
df.sort_values(by='height',ascending=False)
# NaN을 가장 위로 올림: na_position의 기본값은 last
df.sort_values(by='height', na_position='first')
#1차 정렬: 키(내림차순), 2차 정렬: 브랜드(오름차순)
df.sort_values(by=['height','brand'], ascending=[False,True], na_position='first')
5.데이터 다루기
df.head()
df['blood'] # 자료형: 시리즈
type(df['blood'])
5-1. 범위 선택
df.head(3)
df[:3]
# loc 인덱싱: 레이블(이름) 인덱싱, 행과 열 모두 인덱싱과 슬라이싱이 가능
df.loc[:,'name']
df.loc[2:5,'name'] # 5번을 포함한다. 2번부터 5번까지
df.loc[:,['name','gender','height']]
df.loc[3:8,'name':'gender']
#iloc 인덱싱: index로 인덱싱, 행과 열 모두 인덱싱과 슬라이싱이 가능
df.iloc[:,[0,2]]
df.iloc[:, 0:2] # 2번 컬럼을 포함하지 않음
df.iloc[1:3, 2:4]
6. Boolean Indexing
df['height'] >= 180
df[df['height'] >= 180]
df['name'][df['height'] >= 180]
df[['name','gender','height']][df['height'] >= 180]
df.loc[:,['name','gender','height']][df['height'] >= 180]
df.loc[df['height'] >= 180,['name','gender','height']]
7. isin
- 정의한 list에 있는 데이터를 색인하려는 경우 사용하는 함수
company = ['플레디스','SM']
df['company'].isin(company)
df[df['company'].isin(company)]
df.loc[df['company'].isin(company)]
8. 결측값(Null,NaN)
- Null은 비어있는 값, 결측값이라고 부름
- pandas에서는 NaN(Not a Number)로 표기 된 것은 모두 결측값으로 취급
df[df['group'].isna()]
df['name'][df['group'].isna()]
df[df['group'].notnull()]
#그룹이 있는 연예인의 이름, 키, 혈액형을 loc를 사용하여 출력
df.loc[df['group'].notnull(),['name','height','blood']]
df['height']
#fillna(): 결측값을 채워주는 함수
df['height'].fillna(0)
df['height'].fillna(0, inplace=True)
df
height = df2['키'].mean()
height
결측치를 평균값으로 채워 넣는다.
#결측값이 있는 행을 제거
#결측값이 한개라도 있는 경우 행을 삭제Dropna()
df.dropna()
new_df['이름'] = '김사과'
10. 행,열 추가 및 삭제하기
10-1. 행 추가하기
- dict 형태의 데이터를 만들고, append() 함수를 사용하여 데이터를 추가함
- 반드시 ignore_index = True 옵션을 추가해야 에러가 발생하지 않음
dic1 = {
'이름': '김사과',
'그룹': '애플',
'소속사': 'apple',
'성별': '여자',
'생년월일': '2000-01-01',
'키': 160,
'혈액형': 'A',
'브랜드평판지수': 987654321
}
df = df.append(dic1,ignore_index = True)
# '김사과'의 국적을 '미국'으로 변경(단, loc를 사용하여 작성)
df.loc[df['이름']==('김사과'),'국적'] = '미국'
10-3. 열 제거하기
10-4, 행 제거하기
df.drop([1,3,5], axis = 0)
11. 통계값 다루기
12. 그룹으로 묶기
# groupby: 데이터를 그룹으로 묶어 분석할 때 사용
df.groupby('소속사').count()
df.groupby('그룹').mean()
df.groupby('성별').mean()
# 혈액형별로 그룹을 맺어, 키의 평균값을 확인
df.groupby('혈액형')['키'].mean()
# 혈액형별로 그룹을 맺고, 성별로 또 그룹을 나눈 후, 키의 평균값을 확인
df.groupby(['혈액형','성별'])['키'].mean()
13. 중복값 제거하기
14. 데이터프레임 합치기
df_copy = df1.copy()
# concat(): 데이터를 합침 sort=False 옵션으로 순서가 유지되게 할수 있다. axis=0이 생략
pd.concat([df1, df_copy], sort=False)
df_concat = pd.concat([df1,df_copy], sort= False)
# reset_index(): index를 새롭게 적용. drop=True 옵션으로 기존 index를 삭제
df_concat.reset_index(drop=True)
pd.concat([df1,df2],axis=1) #같은 index와 결합
#merge(): 특정 고유한 키 (unique, id)값을 기준으로 합침
#merge(데이터프레임1, 데이터프레임2, on='유니크한 값',how='병합의 기준)
#병합의 기준: left, right, inner
pd.merge(df1,df_right,on='이름',how='left')
df_right = df_right.append({'이름':'김사과','연봉':5000,'가족수':5},ignore_index=True)
pd.merge(df1, df_right, left_on='이름',right_on = '성함',how='left')
15. 등수 매기기
16.날짜타입 사용하기
17. apply
- Series나 DataFrame에 구체적인 로직을 적용하고 싶을 때 사용
- apply를 적용하기 위해서는 별도의 함수가 먼저 정의되야 함
- 먼저 작성된 함수를 apply에 매개변수로 전달함
# 성별이 남자는1, 여자는 0으로 변환(loc 사용)
df.loc[df['성별']=='남자','성별']=1
df.loc[df['성별']=='여자','성별']=0
def male_or_female(x):
if x == '남자':
return 1
elif x == '여자':
return 0
18. map
- 딕셔너리를 통해 데이터와 같은 키의 값을 적용
map_gender = {'남자':1, '여자':0}
df['성별'].map(map_gender)
19. 데이터프레임의 산술연산
df = pd.DataFrame({
'파이썬': [60,70,80,86,95],
"데이터분석": [40,60,70,55,88],
"머신러닝": [90,40,30,100,55]
})
df
df['파이썬'].sum()#df['파이썬'].sum(axis = 0)
df['파이썬'].mean()
df.mean()
df1 = pd.DataFrame({
'파이썬': [60,70,80,86,95],
"데이터분석": [40,60,70,55,88],
"머신러닝": [90,40,30,100,55]
})
df2 = pd.DataFrame({
'파이썬': ['C','A','B','B','C'],
"데이터분석": [40,60,70,55,88],
"머신러닝": [90,40,30,100,55]
})
20. select_dtypes
21. 원 핫 인코딩(One Hot Encoding)
- 더미변수
- 원 핫 인코딩은 한개의 요소는 1, 나머지 요소는 0으로 만들어 카테고리형을 표현하는 방법
- 예) df['혈액형_code']를 머신러닝/딥러닝 알고리즘에 넣어 데이터를 예측하려고 지시를 하면 컴퓨터는 값들간의 관계를 스스로 형성하게 됨 -> 만약 B형은 1, AB형은 2라는 값을 가지고 있을 때 컴퓨터는 'B형 + AB형 = O형'라는 이상한 관계를 맺을 수 있게 됨 -> 별도의 column들을 형성해주고 1개의 column에는 1, 나머지는 0으로 넣어줌으로 'A, B, AB, O형의 관계는 서로 독립적이다'라는 카테고리로 표현해주는 방식을 사용
# pd.get_dummies(): 원 핫 인코딩을 적용
pd.get_dummies(df['혈액형_code'])
df = pd.get_dummies(df, columns=['혈액형_code'])