데이터분석

(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. 데이터프레임 기본정보 알아보기

df = pd.read_csv('http://bit.ly/ds-korean-idol') # 주소를 통해 가져올 수 있다.

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. 데이터프레임 합치기

df1 = pd.read_csv('http://bit.ly/ds-korean-idol')
 
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'])