Pandas 기본

Updated:

Pandas

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

Series

  • numpy array가 보강된 형태 Data와 Index를 가지고 있다
import pandas as pd

data = pd.Series([1, 2, 3, 4])
data
# 0    1
# 1    2
# 2    3
# 3    4
# dtype: int64
  • 인덱스를 가지고 있고 인덱스로 접근 가능하다
  • 딕셔너리와 비슷하다
data = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
data['b']
# 2
  • 딕셔너리로 만들 수 있다
  • pandas_series.values 는 Numpy array이다
population_dict = {
  'korea': 5180,
  'japan': 12718,
  'china': 141500,
  'usa': 32676
}
population = pd.Series(population_dict)
# china    141500
# japan   12718
# korea    5180
# usa    32676
# dtype: int64

population.values
# array([  5180,  12718, 141500,  32676], dtype=int64)

DataFrame

  • 여러 개의 Series가 모여서 행과 열을 이룬 데이터
population_dict = {
  'korea': 5180,
  'japan': 12718,
  'china': 141500,
  'usa': 32676
}
gdp_dict = {
  'korea': 169320000,
  'japan': 516700000,
  'china': 1409250000,
  'usa': 2041280000
}

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

country
# 	  population	gdp
# korea	5180	  169320000
# japan	12718	  516700000
# china	141500	1409250000
# usa	  32676	  2041280000

country.index
# Index(['korea', 'japan', 'china', 'usa'], dtype='object')

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

type(country['gdp'])
# pandas.core.series.Series
# columns값을 넣어서 관련된 값만 뽑으면 Series 타입이다
gdp_per_capita = country['gdp'] / country['population']
country['gdp_per_capita'] = gdp_per_capita

country
#    population	    gdp	    gdp_per_capita
# korea	5180	  169320000	  32687.258687
# japan	12718	  516700000	  40627.457147
# china	141500	1409250000	9959.363958
# usa	  32676	  2041280000	62470.314604

저장과 불러오기

  • 만든 데이터 프레임을 저장할 수 있다
country.to_csv("./country.csv")
country.to_excel("country.xlsx")

country = pd.read_csv("./country.csv")
country = pd.read_excel("country.xlsx")
# country는 데이터 프레임 형식이다

Indexing & slicing

loc

  • 명시적인 인덱스를 참조하는 인덱싱/슬라이싱
country.loc['china']
# population        1.415000e+05
# gdp               1.409250e+09
# gdp_per_capita    9.959364e+03
# Name: china, dtype: float64

# Series 형식

country.loc['korea':'japan',:'population']
#       population
# korea	5180
# japan	12718

# population이 포함된다

iloc

  • 파이썬 스타일 정수 인덱스 인덱싱/슬라이싱
country.iloc[0]
# population        5.180000e+03
# gdp               1.693200e+08
# gdp_per_capita    3.268726e+04
# Name: korea, dtype: float64

country.iloc[0:2, :2]
#     population	gdp
# korea	5180	169320000
# japan	12718	516700000

새 데이터 추가/수정

  • 리스트로 추가하는 방법과 딕셔너리로 추가하는 방법
dataframe = pd.DataFrame(columns = ['이름','나이','주소'])
dataframe.loc[0] = ['임원균', '26', '서울']
dataframe.loc[1] = {'이름':'철수', '나이':'25', '주소':'인천'}
dataframe
#   이름	  나이	주소
# 0	임원균	 26	   서울
# 1		  25	  인천

dataframe.loc[1, '이름'] = '영희'
dataframe
#   이름	  나이	주소
# 0	임원균	 26	   서울
# 1	영희	  25	  인천
  • nan(Not a Number) : 값이 비어있다
dataframe['전화번호'] = np.nan
#	  이름	나이	주소	전화번호
# 0	임원균	26	 서울	  NaN
# 1	영희	 25	  인천	 NaN 

dataframe.loc[0, '전화번호'] = '01012341234'
#	  이름	나이	주소	전화번호
# 0	임원균	26	 서울	  01012341234
# 1	영희	 25	  인천	 NaN 

len(dataframe)
# 2

컬럼 선택하기

  • 컬럼이름이 하나만 있다면 Series
  • 리스트로 들어가 있다면 DataFrame
dataframe["이름"]
# 0    임원균
# 1     영희
# Name: 이름, dtype: object

# 타입이 Series

dataframe[["이름","주소","나이"]]
#   이름	 주소	 나이
# 0	임원균	서울	26
# 1	영희	 인천	 25

# 타입이 DataFrame

누락된 데이터 체크

  • 현실의 데이터는 누락되어 있는 형태가 많다
  • nan 또는 None

isnull(), notnull()

dataframe.isnull()
#   이름	 나이	  주소	전화번호
# 0	False	False	False	False
# 1	False	False	False	True

dataframe.notnull()
#	  이름	  나이	주소	전화번호
# 0	True	True	True	True
# 1	True	True	True	False

dropna()

dataframe.dropna()
#   이름	나이	주소	전화번호
# 0	임원균	26	서울	01012341234

dataframe['전화번호'] = dataframe['전화번호'].fillna('전화번호 없음')
#   이름	나이	주소	 전화번호
# 0	임원균	26	 서울	  01012341234
# 1	영희	 25	  인천	 전화번호 없음

Series 연산

  • numpy array에서 사용했던 연산자들을 활용할 수 있다
A = pd.Series([2, 4, 6], index = [0, 1, 2])
# 0    2
# 1    4
# 2    6
# dtype: int64

B = pd.Series([1, 3, 5], index = [1, 2, 3])
# 1    1
# 2    3
# 3    5
# dtype: int64

A + B
# 0    NaN
# 1    5.0
# 2    9.0
# 3    NaN
# dtype: float64

A.add(B, fill_value = 0)
# 0    2.0
# 1    5.0
# 2    9.0
# 3    5.0
# dtype: float64

DataFrame 연산

  • add(+), sub(-), mul(*), div(/)
A = pd.DataFrame(np.random.randint(0, 10, (2, 2)), columns=list("AB"))
#   A	B
# 0	1	9
# 1	7	5

B = pd.DataFrame(np.random.randint(0, 10, (3, 3)), columns=list("BAC"))
#   B	A	C
# 0	9	4	5
# 1	6	7	3
# 2	3	0	2

A + B
#   A	B	C
# 0	5.0	18.0	NaN
# 1	14.0	11.0	NaN
# 2	NaN	NaN	NaN

A.add(B, fill_value=0)
#   A	B	C
# 0	5.0	18.0	5.0
# 1	14.0	11.0	3.0
# 2	0.0	3.0	2.0

집계함수

  • numpy array에서 사용했던 sum, mean등을 활용할 수 있다
data = {
  'A': [ i+5 for i in range(3) ],
  'B': [ i**2 for i in range(3) ]
}
df = pd.DataFrame(data)
#   A	B
# 0	5	0
# 1	6	1
# 2	7	4

df['A'].sum() 
# 18

df.sum()
# A    18
# B     5
# dtype: int64

df.mean()
# A    6.000000
# B    1.666667
# dtype: float64

DataFrame 정렬하기

값으로 정렬하기

  • sort_values()
df = pd.DataFrame({
  'col1' : [2, 1, 9, 8, 7, 4],
  'col2' : ['A', 'A', 'B', np.nan, 'D', 'C'],
  'col3' : [0, 1, 9, 4, 2, 3],
})  
#   col1	col2	col3
# 0	2	A	0
# 1	1	A	1
# 2	9	B	9
# 3	8	NaN	4
# 4	7	D	2
# 5	4	C	3

df.sort_values('col1')
#   col1	col2	col3
# 1	1	A	1
# 0	2	A	0
# 5	4	C	3
# 4	7	D	2
# 3	8	NaN	4
# 2	9	B	9

df.sort_values('col1', ascending=False)
#   col1	col2	col3
# 2	9	B	9
# 3	8	NaN	4
# 4	7	D	2
# 5	4	C	3
# 0	2	A	0
# 1	1	A	1

df.sort_values(['col2', 'col1'])
#   col1	col2	col3
# 1	1	A	1
# 0	2	A	0
# 2	9	B	9
# 5	4	C	3
# 4	7	D	2
# 3	8	NaN	4

df.sort_values(['col2','col1'] ,ascending = [True,False])
#   col1 col2  col3
# 0     2    A     0
# 1     1    A     1
# 2     9    B     9
# 5     4    C     3
# 4     7    D     2
# 3     8  NaN     4

head

  • 위에서 부터 5개의 값을 보여준다

Leave a comment