Python | Pandas

Jihun Kim·2021년 9월 3일
0

파이썬

목록 보기
5/11

Pandas

  • 구조화된 데이터를 효과적으로 처리하고 저장할 수 있는 파이썬 라이브러리
  • numpy를 기반으로 만들어져 다양한 기능 제공함

Series

  • series : numpy array가 보강된 형태의 data와 index를 가짐
import pandas as pd

data = pd.Series([1, 2, 3, 4])
  • 인덱스를 가지고 있어 인덱스로 접근 가능하다.
data = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
  • 딕셔너리로 만들 수 있다.
population_dict = {"a": 1, "b":2}
population = pd.Series(population_dict)
# 데이터가 numpy 객체로 이루어져 있다.

DataFrame

  • 여러개의 Series가 모여서 행과 열을 이룬 데이터
gdp_dict = {"a": 1, "b":2}
gdp = pd.Seires(gdp_dict)

population_dict = {"a": 1, "b":2}
population = pd.Series(population_dict)

country = pd.DataFrame({'population': population, 'gdp': gdp})

👉 인덱스 확인하기

country.index  # Index(['china', 'japan', ...])

👉 컬럼 확인하기

country.columns  # Index(['gdp', 'population', ...], dtype='object')

👉 원하는 컬럼만 뽑기

country['gdp']
type(country['gdp'])

DataFrame의 다양한 기능 🏏

1. DataFrame의 Series 연산하기

# 나누기 연산
gdp_per_capita = country['gdp'] / country['population]

# 컬럼 추가
country['gdp per capita'] = gdp_per_capita

2. 저장과 불러오기

country.to_csv("./country.csv")
country.to_excel("country.xlsx")

country = pd.read_csv("./country.csv")
country = pd.read_excel("./country.xlsx")

Indexing/ slicing 🥌

  1. loc
  • loc: 명시적인 인덱스를 참조하는 인덱싱/슬라이싱
country.loc['china']
country.loc['japan':'korea', :'population']
  1. iloc
  • iloc: 파이썬 스타일의 정수 인덱스 인덱싱/슬라이싱
country.iloc[0]
country.iloc[1:3, :2]

새 데이터 추가/ 수정하기

  • 리스트로 추가하는 방법과 딕셔너리로 추가하는 방법이 있다.
df = pd.DataFrame(columns=['이름', '나이', '주소']

# 리스트로 추가하기
df.loc[0] = ['철수', '20', '서울']

# 딕셔너리로 추가하기
df.loc[1] = {'이름': '영희', '나이': '30', '주소': 경기}

# 수정하기
df.loc[1, '이름'] = '철희'
  • 새 컬럼 추가
df['전화번호'] = np.nan  # NaN을 가진 열이 추가됨

len(df)  # '행'의 길이

컬럼 선택하기

  • 컬럼 이름이 하나만 있다면 Series
  • 리스트로 들어가 있다면 DataFrame
df['이름']  # series가 출력됨

df[['이름', '주소', '나이']]  # dataframe이 출력됨

Pandas 연산과 함수 🏂

누락된 데이터 체크

df.isnull()  # 비어 있으면 True
df.notnull()  # 비어 있지 않으면 True
  • 비어있는 값 제거하기 & 채워넣기
df.dropna()

df['전화번호'] = df['전화번호'].fillna('없음')

Series 연산

  • numpy array에서 사용했던 연산자들 활용 가능
A + B
A.add(B, fill_value=0)  
# 만약 인덱스가 같지 않으면 계산될 수 없으므로 NaN이 된다. 
# 이를 방지하기 위해 없는 index 값은 fill_value = 0으로 채운다.

집계함수

  • numpy array에서 사용했던 sum, mean 등을 그대로 사용할 수 있다.
df = pd.DataFrame(data)  # data는 dict
df['A'].sum()
df.sum()
df.mean()

DataFrame 정렬하기 🤾‍♂️

값으로 정렬하기

  • sort_values()
df.sort_values('col1')  # col1의 값들 정렬(기본 오름차순)
df.sort_values('col1', ascending=False)  # 내림차순 정렬

df.sort_values(['col2', 'col1'])  # col2를 정렬한 다음 col1을 정렬함(즉, col2가 같은 경우 col1을 정렬하게 된다.)

⚡ 두 열의 정렬 기준이 다르다면 ascending의 인자를 리스트로 주면 된다.

# col2를 기준으로 오름차순으로, col1를 기준으로 내림차순으로 정렬하기
df.sort_values(['col2', 'col1'], ascending=[True, False])

조건으로 검색하기 🏹

1. 조건 검색

import numpy as np
import pandas as pd


df['A'] < 0.5
df[(df['A'] < 0.5) & (df['B'] > 0.3)]
df.query('A < 0.5 and B > 0.3')  # query로 조건 검색

2. 문자열 검색

df['Animal'].str.contains('Cat')  # Cat을 포함하는지 확인
df.Animal.str.match('Cat')  # Cat인지 확인
df['Animal'] == 'Cat'  # Cat인지 확인

함수로 데이터 처리하기 ⛸

  • apply를 이용해 함수로 데이터를 다룰 수 있다.
def square(x):
	return x**2
    
df['Square] = df["Num"].apply(square)
df['Square] = df["Num"].apply(lambda x : x**2)
def get_processed_phone(phone):
	mapping_dict = {
    	"공": "0",
        ...
    }
    for key, value in mapping_dict.items():
    	phone = phone.replace(key, value)
        
    return phone
    
 df['preprocessed_phone'] = df['phone'].apply(get_processed_phone)
  • replace를 이용해 '데이터 값'만 대체할 수 있다.
df['Sex'] = df.Sex.replace({"Male": 0, "Female": 1})
# inplace=True : 그대로 데이터 값을 바꾸고 싶을 때 사용
df.Sex.replace({"Male": 0, "Female": 1}, inplace=True)

그룹으로 묶기 🥏

  • 조건부로 집계하고 싶은 경우에 사용한다.

1. groupby

df.groupby('key')
# 출력시 'groupby object'가 출력된다.
# <pandas.core.groupby.groupby.DataFrameGroupBy object at 0x10e3588> 

df.groupby('key').sum()

# key를 묶고, data1을 묶는다.
df.groupby(['key', 'data1']).sum()

2. aggregate

  • groupby를 통해서 집계를 한 번에 계산하는 방법
df.groupby('key').aggregate([min, np.median, max])
df.groupby('key').aggregate({'data1': 'min', 'data2': np.sum})

3. filter

  • groupby 통해서 그룹 속성을 기준으로 데이터 필터링
def filter_by_mean(x):
	return x['data2'].mean() > 3
    
df.groupby('key').mean()
df.groupby('key').filter(filter_by_mean)

groupby에도 apply 적용이 가능하다.

df.groupby('key').apply(lambda x: x.max() - x.min())

4. get_group

  • groupby로 묶은 데이터를 추출할 수 있다.
df.gruopby('시도').get_group('충남')  # 시도별로 묶인 것 중 '충남'에 대한 데이터만 가져올 수 있다.
len(df.gruopby('시도').get_group('충남'))

Multiindex

  • 인덱스를 계층적으로 만들 수 있다.
# 인덱스를 2차원 리스트를 만든다.
df = pd.DataFrame(
	np.random.randn(4, 2),
    index = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]],
    columns = ['data1', 'data2']
)
  • 열 인덱스도 계층적으로 만들 수 있다.
df = pd.DataFrame(
	np.random.randn(4, 4),
    columns = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
)
  • 다중 인덱스 컬럼일 경우 인덱싱 역시 계층적으로 한다.
df['A']
df['A']['1']  # A 컬럼의 1번 컬럼

pivot_table

  • 데이터에서 필요한 자료만 뽑아서 새롭게 요약, 분석할 때 사용한다.
  • 엑셀의 피봇 테이블과 같다.
  • 세 가지 값이 필요하다
    👉 index는 행 인덱스로 들어갈 key
    👉 column에 열 인덱스로 라벨링될 값
    👉 value에 분석할 데이터

  • 타이타닉 데이터에서 성별과 좌석별 생존률 구하기

df.pivot_table(
    index='sex', 
    columns='class', 
    values='survived', 
    aggfunc=np.mean  # 채울 값을 결정한다.(나온 데이터들을 평균내서 채운다.)
)
df.pivot_table(
	index='월별',
    columns='내역',
    values=['수입', '지출']
)

🐧 이 글은 엘리스 AI 트랙 과정 중 '실전 데이터 분석' 강의 내용을 바탕으로 작성 되었습니다.

profile
쿄쿄

0개의 댓글