보리차
05) Pandas 본문
Pandas
구조화된 데이터를 효과적으로 처리하고 저장할 수 있는 파이썬 라이브러리.
Array 계산에 특화된 numpy를 기반으로 만들어져서 다양한 기능들을 제공한다.
Series
numpa array가 보강된 형태
Data와 Index를 가지고 있다.
import pandas as pd
data = pd.Series([1, 2, 3, 4])
data
인덱스를 가지고 있고 인덱스로 접근 가능하다.
data = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']) # index 지정
data['b]
# 2
딕셔너리로 만들 수 있다.
population_dict = {
'korea': 5180,
'japan': 12718,
'china': 141500,
'usa': 32676,
}
population = pd.Series(population_dict) # key값: index, value값: data
# korea 5180
# japan 12718
# china 141500
# usa 32676
# dtype: int64
population.values => Numpy array
DataFrame
여러 개의 Series가 모여서 행과 열을 이룬 데이터
import numpy as np
import pandas as pd
print("Population series data:")
population_dict = {
'korea': 5180,
'japan': 12718,
'china': 141500,
'usa': 32676
}
population = pd.Series(population_dict)
print("GDP series data:")
gdp_dict = {
'korea': 169320000,
'japan': 516700000,
'china': 1409250000,
'usa': 2041280000,
}
gdp = pd.Series(gdp_dict)
# 2개의 시리즈 값이 들어간 데이터프레임을 생성
print("Country DataFrame")
country = pd.DataFrame({
'population': population,
'gdp': gdp
})
# Series도 numpy array처럼 연산자를 쓸 수 있다.
# 데이터 프레임에 gdp per capita 칼럼을 추가하고 출력
gdp_per_capita = country['gdp'] / country['population']
country['gdp per capita'] = gdp_per_capita
print(country, "\n")
# index와 column (딕셔너리로 만들 수 있다.)
print(country.index)
print(country.columns)
### 출력 ###
Country DataFrame
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
Index(['korea', 'japan', 'china', 'usa'], dtype='object')
Index(['population', 'gdp', 'gdp per capita'], dtype='object')
저장과 불러오기
만든 데이터 프레임을 저장할 수 있다.
country.to_csv("../country.csv")
country.to_excel("country.xlsx")
country = pd.read_csv("../country.csv")
country = pd.read_excel("country.xlsx")
Indexing / Slicing
loc: 명시적인 인덱스를 참조하는 인덱싱/ 슬라이싱
country.loc['china']
country.loc['japan':'korean', :'population']
iloc: 파이썬 스타일 정수 인덱스 인덱싱/슬라이싱
country.iloc[0]
country.iloc[1:3, :2]
명시적인 loc를 더 자주 쓴다
DataFrame에 새 데이터 추가/수정
리스트로 추가하는 방법과 딕셔너리로 추가하는 방법
dafaframe = pd.DataFrame(columns=['이름', '나이', '주소'])
dataframe.loc[0] = ['임원균', '26', '서울']
dataframe.loc[1] = {'이름':'철수', '나이':'25', '주소':'인천'}
dataframe.loc[1, '이름'] = '영희'
DataFrame 새 컬럼 추가
dataframe['전화번호'] = np.nan # Not a Number 비어있는 데이터
dataframe.loc[0, '전화번호'] = '01012341234'
len(dataframe)
# 2
컬럼 선택하기
컬럼이름이 하나만 있다면 Series
리스트로 들어가 있다면 DataFrame
dataframe['이름']
dataframe[['이름', '주소', '나이']]
pandas 연산과 함수
누락된 데이터 체크
dataframe.isnull() # 데이터가 비어있으면 True
dataframe.notnull() # 데이터가 비어있으면 False
dataframe.dropna() # 비어있는 데이터가 있다면 컬럼 드랍
dataframe['전화번호'] = dataframe['전화번호'].fillna('전화번호 없음')
# 비어있는 데이터에 0, 1과 같은 데이터를 채우거나 평균값을 채우는 식으로 유효한 데이터를 넣을 수 있음
Series 연산
numpy array에서 사용했던 연산자들을 활용할 수 있다.
A = pd.Series([2, 4, 6], index=[0, 1, 2])
B = pd.Series([1, 3, 5], index=[1, 2, 3])
A + B # 값이 없는 경우에 Nan으로 나옴
# 0 NaN
# 1 5.0
# 2 9.0
# 3 NaN
# dtype: float64
A.add(B, fill_value=0) # 값이 없으면 0으로 채워서 계산
# 0 2.0
# 1 5.0
# 2 9.0
# 3 5.0
# dtype: float64
DataFrame 연산
+, -, *, /
A = pd.DataFrame(np.random.randint(0, 10, (2, 2)), columns=list("AB"))
B = pd.DataFrame(np.random.randint(0, 10, (3, 3)), columns=list("BAC"))
A + B
# A B C
# 0 12.0 3.0 NaN
# 1 11.0 5.0 NaN
# 2 NaN NaN NaN
A.add(B, fill_value=0)
# A B C
# 0 12.0 3.0 4.0
# 1 11.0 5.0 2.0
# 2 9.0 6.0 4.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)
df['A'].sum() # 18
df.sum()
# A 18
# B 5
# dtype: int64
df.mean()
# A 6.000000
# B 1.666667
# dtype: float64
값으로 정렬하기
sort_values( )
df.sort_values('col1') # 인자에 컬럼값을 넣으면 컬럼을 기준으로 sort
df.sort_values('col1', ascending=False) # 내림차순 정렬
df.sort_values(['col2', 'col1']) # col2를 기준으로 정렬, 같은 값이 있으면 sol1로 정렬
# col2를 기준으로 오름차순으로, col1를 기준으로 내림차순으로 정렬하기.
sorted_df3 = df.sort_values(['col2', 'col1'], ascending=[True, False])
[출처: 앨리스AI트랙 2기 aitrack.elice.io]
'공부 > 데이터 분석' 카테고리의 다른 글
07) Matplotlib 데이터 시각화 (0) | 2021.09.07 |
---|---|
06) Pandas 심화 (0) | 2021.09.05 |
04) NumPy (0) | 2021.09.02 |
03) 복잡한 형태의 데이터: csv, lambda, map, filter (0) | 2021.08.31 |
02) 데이터형 변환 - 딕셔너리, JSON, 집합, matplotlib (0) | 2021.08.31 |