Language/Python

[Python] Pandas 기초 및 실습

또개해삼 2022. 3. 14. 00:16

💡 Pandas? 

Pandas는 데이터 조작과 분석을 위한 파이썬 소프트웨어 라이브러리 입니다. Pandas에서는 표 형태의 데이터를 다루기 위한 두 가지 주요 데이터 구조인 Serise(1차원)와 DataFrame(2차원)이 존재합니다.

 

💡 Series? 

Series는 1차원의 데이터를 다룹니다. 1차원 리스트와 유사하지만, 리스트와의 큰 차이점은 시리즈는 인덱스 이름을 부여할 수 있다는 점 입니다.

 

💡 DataFrame? 

DataFrame은 판다스의 2차원 자료구조 입니다. 시리즈들의 집합이며 행과 열이 있는 테이블 형태를 가집니다.

 

 

1. Series

Series 객체 생성

import pandas as pd

value = pd.Series(['가','나','다','라'])
print(value)

 

value[0]

 

Series Index 지정

value = pd.Series(['가','나','다','라'], index=['one', 'two', 'three', 'four'])
value

 

2. DataFrame

원피스 주요 인물 8명에 대한 데이터

data = {
    '이름' : ['루피', '조로', '상디', '나미', '우솝', '쵸파', '로빈', '프랑키'],
    '고향' : ['Eastblue','Northblue','Northblue', 'Eastblue', 'Grandline', 'Grandline', 'OHARA', 'Waterseven'],
    '키' : [174, 181, 180, 170, 173, 90, 188, 240],
    '국어' : [90, 40, 80, 40, 15, 80, 55, 100],
    '영어' : [85, 35, 75, 60, 20, 100, 65, 85],
    '수학' : [100, 50, 70, 70, 10, 95, 45, 90],
    '과학' : [95, 55, 80, 75, 35, 85, 40, 95],
    '사회' : [85, 25, 75, 80, 10, 80, 35, 95],
    '기술' : ['레드호크', '아수라', '디아블잠브', '', '', '', '풀루르', '라디컬 빔']
}

 

DataFrame 객체 생성

import pandas as pd
df = pd.DataFrame(data)
df

 

데이터 조회

df['이름']

 

df[['이름','키']]

 

DataFrame 인덱스 지정해서 객체 생성

df = pd.DataFrame(data, index=['1번','2번','3번','4번','5번','6번','7번','8번',])
df

 

Index 이름 설정

df.index.name ='입단순서'
df

 

Index 이름 삭제

df.reset_index(drop=True, inplace=True) # inplace=True을 함으로써 실제 데이터에 바로 반영

 

Index 정렬

df.sort_index() # 인덱스로 오름차순 정렬

 

df.sort_index(ascending=False) # 내림차순으로 정렬

 

3. 파일 저장 및 열기

csv 파일로 저장

df.to_csv('onepiece.csv', encoding='utf-8-sig') # 한글 인코딩

 

텍스트 파일로 저장

df.to_csv('onepiece.txt', sep='\t') # tab 으로 구분된 텍스트 파일

 

엑셀 파일로 저장

df.to_excel('onepiece.xlsx')

 

csv 파일 열기

df = pd.read_csv('onepiece.csv') # 데이터 프레임객체로 변환
df

 

df = pd.read_csv('score.csv', skiprows = 1) # 지정된 갯수 만큼의 row 를 건너뜀
df

 

df = pd.read_csv('score.csv', nrows=4) # 지정된 갯수 만큼의 row 만 가져옴
df

 

df = pd.read_csv('onepiece.csv', skiprows=2, nrows=4) # 처음 2 row 무시, 이후에 4개 row를 갖고옴 , nrows는 헤더를 포함하고 4개 갖고옴
df

 

4. 데이터 조회 및 확인

DataFrame 확인

df.describe() # 계산 가능한 데이터에 대해 Column 별로 데이터의 갯수, 평균, 표준편차, 최소/최대값 등의 정보를 보여줌

 

df.info()

 

df.head(7) # 처음 7개의 row 를 가져옴

 

df.tail(3) # 마지막 3개 row 를 가져옴

 

df.values

 

df.index

 

df.columns

 

df.shape # row, column

 

Series 확인

df['키'].describe()

 

df['키'].min()

 

df['키'].max()

 

df['키'].nlargest(3) # 키 큰 사람 순서대로 3명 데이터

 

df['키'].mean() # 평균값

 

df['키'].sum()

 

df['기술'].count()

 

df['고향'].unique() # 중복 제거

 

5. 데이터 선택

import pandas as pd
df = pd.read_excel('onepiece.xlsx', index_col='입단순서')
df

 

Column 선택

df['이름']

 

df[['이름','키']] # 2개 컬럼이면 [] 한번도 감싸줌

 

Column 선택 (정수 index)

df.columns

 

df.columns[2]

 

df[df.columns[0]] # df['이름'] 과 동일한 동작

 

슬라이싱

df['영어'][0:5] # 0~4 까지 영어 점수 데이터 가져옴

 

df[3:] # 4~8 까지 전체 데이터 가져옴

 

loc는 이름을 이용하여 원하는 row에서 원하는 column을 선택

df.loc['1번'] # index 1번에 해당하는 전체 데이터

 

df.loc['1번','국어'] # index 1번에 해당하는 국어 데이터

 

df.loc['1번':'5번', '국어':'사회'] # index 1번부터 5번까지, 국어부터 사회까지 데이터 (5번 직전까지가 아닌 포함해서 갖고온다.)

 

df['키'] >= 175 # 학생들의 키가 185 이상인지 여부를 True / False

 

filt = (df['키'] >= 175)
df[filt] # 조건을 포함해서 확인

 

df[df['키'] >= 175 ]

 

df.loc[df['키'] >= 175, ['이름','수학','과학']] # 키가 175 이상인 학생들이 이름, 수학, 과학 데이터

 

6. 다양한 조건

& 그리고

df.loc[(df['키'] >= 175) & (df['고향'] == 'Northblue')] # 키가 175 이상인 Norhblue 데이터

| 또는

df.loc[(df['키'] < 170) | (df['키'] > 190)] # 키가 170보다 작거나, 190 보다 큰 데이터

 

str 함수

filt = df['이름'].str.startswith('프') # '프'씨 성을 가진 사람
df[filt]

 

df[~filt] # 이름에 '프' 가 들어가는 사람을 제외

 

langs = ["Eastblue", "Grandline"]
filt = df['고향'].isin(langs) # 고향이 Eastblue 이거나 Grandline 인 사람
df[filt]

 

7. 결측치

비어 있는 데이터

 

import pandas as pd
df = pd.read_excel('onepiece.xlsx', index_col='입단순서')
df

 

데이터 채우기 fillna

df.fillna('') # Nan 데이터를 빈 칸으로 채움

 

df.fillna('없음', inplace = True) # 만약 원본 df DataFrame 을 보존할 필요가 없이 바로 결과값으로 수정하고 싶으면 inplace=True 옵션을 설정해주면 됩니다.
df

 

💡Numpy?

Numpy는 다차원 배열을 쉽게 처리하고 효율적으로 사용할 수 있도록지원하는 파이썬의 패키지입니다. NumPy는 데이터 구조 외에도 수치 계산을 위해 효율적으로 구현된 기능을 제공합니다. 

import numpy as np
df['기술'] = np.nan # 기술 데이터 전체를 Nan 으로 채움

 

데이터 제외하기

df.dropna() # 전체 데이터 중에서 Nan 을 포함하는 데이터 삭제

 

df.dropna(axis = 'index', how = 'any') # Nan 가 하나라도 있는 row 삭제

 

df.dropna(axis='columns') # Nan 이 하나라도 있는 column 삭제

 

df.dropna(axis = 'columns', how = 'all') # 데이터 전체가 Nan 인 경우에만 Column 삭제

 

8. 데이터 정렬

df.sort_values('키') # 키 기준으로 오름차순 정렬

 

df.sort_values('키', ascending=False) # 키 기준으로 내림차순 정렬

 

df.sort_values(['수학','영어']) # 수학,영어 점수 기준으로 오름차순(우선순위가 수학 먼저이며 수학점수가 같을때 영어점수 오름차순)

 

df.sort_values(['수학','영어'], ascending=[True,False]) # 수학 점수는 오름차순 영어점수는 내림차순으로 정렬(수학 점수 같은때 영어점수를 내림차순)

 

9. 데이터 수정

import pandas as pd
df = pd.read_excel('onepiece.xlsx', index_col='입단순서')
df

 

df['고향'].replace({'Eastblue' : '이스트블루', 'Waterseven' : '워터세븐'},inplace=True)
df

 

df['고향'] = df['고향'].str.lower()
df

 

df['고향'] = df['고향'] + '출신' # 고향 데이터 + 출신
df

 

Column 추가

df['총합'] = df['국어'] + df['영어'] + df['수학'] + df['과학'] + df['사회']
df

 

df.loc[df['총합'] > 400, '결과'] = 'Pass' # 총합이 400 보다 큰 데이터에 대해서 결과를 Pass로 업데이트
df

 

Column 삭제

df.drop(columns=['총합']) # 총합 Column 을 삭제

 

Row 삭제

df.drop(index='4번') # 4번 학생 데이터  row를 삭제

 

Row 추가

df.loc['9번'] = ['징베','바다','304','90','90','90','90','90','어인공수도', 450,'Pass'] # 새로운 Row 추가
df

 

df.loc['4번','기술'] = '크라마 택트' # 4번 사람의 기술 데이터를 Nan -> 크라마 택트로 변경
df

 

10. 함수 적용

import pandas as pd
df = pd.read_excel('onepiece.xlsx', index_col='입단순서')
df

 

df['고향'] = df['고향'] + '출신'
df

 

키의 값은 정수임으로 dtype 오류 발생 함수 적용으로 해결 가능

df['키'] = df['키'] +'cm'
df

 

데이터에 함수 적용(apply)

# 키 뒤에 cm 을 붙이는 역할
def add_cm(height):
    return str(height) + 'cm'
df['키'] = df['키'].apply(add_cm) # 키 데이터에 대해서 add_cm 함수를 호출한 결과 데이터를 반영
df

 

11. 그룹화

동일한 값을 가진 것들끼리 합쳐서 통계 또는 평균 등의 값을 계산하기 위해 사용

 

import pandas as pd
df = pd.read_excel('onepiece.xlsx', index_col='입단순서')
df

 

 

df.groupby('고향').get_group('Grandline') # 고향이 Grandline인 사람

 

df.groupby('고향').mean() # 계산 가능한 데이터들의 평균값

 

df.groupby('고향').size() # 각 그룹의 크기

 

df.groupby('고향')['키'].mean() # 고향으로 그룹화를 한 뒤에 키의 평균 데이터

 

df.groupby('고향')[['이름','기술']].count() # 고향으로 그룹화를 한 뒤에 고향별 이름,기술 데이터의 수를 가져옴

 

df['성별'] = ['남자','남자','남자','여자','남자','남자','여자','남자'] # 성별 Column 추가
df

 

hometown = df.groupby('고향')
hometown['성별'].value_counts() # 고향으로 그룹화를 한 뒤에 성별 사람 수를 가져옴

 

df.groupby(['고향', '성별']).mean() # 고향별, 성별 평균 데이터

 

df.groupby('성별').mean().sort_values('키', ascending=False) # 성별을 그룹화 한뒤에 데이터의 평균과 키를 기준으로 내림차순