2021. 11. 19. 15:11ㆍ데이터분석
pandas데이터
: 구조화된 데이터를 효과적으로 처리하고 저장
: array계산에 특화된 대용량 데이터를 쉽게 처리할 수 있는 numpy를 기반으로 설계할 수 있는 파이썬 라이브러리
행과 열을가진 2차원데이터와 대용량 데이터를 처리에 대해서 효율적이다.
엑셀과 비슷한 데이터베이스형태이다.
1. Series 데이터
series는 numpy의 array가 보강된 형태로서, data와 index를 가지고 있다.
series는 값(values)을 ndarray형태로 가지고 있음
dtype인자로 데이터 타입을 지정할 수도 있다.
data = pd.Series([1, 2, 3, 4], dtype="float")
print(data.dtype) # float64 (실수형)
인덱스를 지정할 수 있고 인덱스 접근 가능
data = pd.Series([1, 2, 3, 4], index = ['a', 'b', 'c', d'])
data['c'] = 5 # 인덱스로 접근하여 요소 변경 가능
Dictionary를 활용하여 Series 생성 가능
population = {
'china' : 141500,
'japan' : 12718,
'korea' : 5180,
'usa' : 32676
}
population = pd.Series(population_dict)
Series 실습
import numpy as np
import pandas as pd
# 예시) 시리즈 데이터를 만드는 방법.
series = pd.Series([1,2,3,4], index = ['a', 'b', 'c', 'd'], name="Title")
print(series, "\n")
# 국가별 인구 수 시리즈 데이터를 딕셔너리를 사용하여 만들어보세요.
dict = {
"korea" : 5180,
"japan" : 12718,
"china" : 141500,
"usa" : 32676
}
country = pd.Series(dict)
print(country)
2. DataFrame 데이터
여러 개의 Series가 모여서 행과 열을 이룬 데이터이다.
population = {
'china' : 141500,
'japan' : 12718,
'korea' : 5180,
'usa' : 32676
}
population = pd.Series(population_dict)
gdp_dict={
'china': 1409250000,
'japan': 516700000,
'korea': 169320000,
'usa': 2041280000,
}
gdp = pd.Series(gdp_dict)
country = pd.DataFrame({
'gdp': gdp,
'population': population
})
country를 뽑아보면 아래의 출력결과가 나타난다. china, japan, korea, usa는 인덱스이고, gdp와 population은 각각 컬럼으로 만들어진다.
Dictionary를 활용하여도 DataFrame을 생성할 수 있다.
data = {
'country' : ['china', 'japan','korea','usa'],
'gdp': [1409250000, 516700000, 169320000, 2041280000],
'population': [141500, 12718, 5180, 32676]
}
country = pd.DataFrame(data)
country = country.set_index('country')
print(country.shape) # (4, 2)
print(country.size) # 8
print(country.ndim) # 2
print(country.values) # [[ 1409250000 141500]
#[516700000 12718]
#[169320000 518]
#[2041280000 32676]]
DataFrame의 index와 column에 이름지정
country.index.name = "Country" # 인덱스에 이름 지정
country.columns.name = "Info" # 컬럼에 이름 지정
print(country.index)
# Index(['china', 'japan', 'korea', 'usa'], dtype='object', name='Country')
print(country.columns)
# Index(['gdp', 'population'], dtype='object', name='Info')
데이터 프레임 저장 및 불러오기 기능
country.to_csv("./country.csv")
country.to_excel("country.xlsx")
country = pd.read_csv("./country.csv")
country = pd.read_excel("country.xlsx")
3. 데이터 선택 및 변경하기
1. .loc : 명시적인 인덱스를 참조하는 인덱스& 슬라이싱 (인덱스를 알고 있을 때 사용할 수 있다.)
country.loc['china'] # 인덱싱
country.loc['japan':'korea', :'population'] # [인덱스, 컬럼] 슬라이싱
2. iloc : 파이썬 스타일의 정수 인덱스 인덱싱(암묵적인 순서 -> 값)/슬라이싱
country.iloc[0] # 인덱싱
country.iloc[1:3, :2] # 슬라이싱
컬럼명을 활용하여 DataFrame에서 데이터를 선택 가능하다!
Masking 연산이나 query 함수를 활용하여 조건에 맞는 DataFrame행을 추출이 가능하다!
country[country['population'] < 10000] # masking연산 활용
country.query("population > 100000") # query 함수 활용
Series도 numpy array처럼 연산자로 활용이 가능하다!
gdp_per_capita = country['gdp'] / country['population']
country['gdp per capita'] = gdp_per_capita
데이터를 추가하거나 수정이 가능하다! 이것을 리스트로 추가하거나 딕셔너리로 추가한다!
df = pd.DataFrame(columns=['이름','나이','주소']) # 데이터프레임 생성
df.loc[0] = ['길동', '26', '서울'] # 리스트로 데이터 추가
df.loc[1] = {'이름':'철수', '나이':'25', '주소':'인천'} # 딕셔너리로 데이터 추가
df.loc[1, '이름'] = '영희' # 명시적 인덱스 활용하여 데이터 수정
Nan값으로 초기화한 후 새로운 컬럼을 추가해보자!
df['전화번호'] = np.nan # 새로운 컬럼 추가 후 초기화
df.loc[0, '전화번호'] = '01012341234' # 명시적 인덱스 활용하여 데이터 수정
# nan = not a number
DataFrame에서 컬럼 삭제 후 원본을 변경해보자!
df.drop('전화번호', axis=1, inplace=True) #컬럼 삭제
# axis =1 :열 방향/ axis=0 : 행 방향
# inplace = True : 원본 변경 / inplace = False : 원본 변경 X
4. 데이터프레임 정렬하기
Index값 기준으로 정렬하기
axis = 0 : 행 인덱스 기준 정렬하기! (default는 오름차순!)
df = df.sort_index(axis=0)
axis = 1 : 열 인덱스 기준 내림차순 정렬하기!
ascending = True는 오름차순으로 정렬하기, ascending=False는 내림차순 정렬이다.
df.sort_index(axis =1, ascending=False)
Column값 기준으로 정렬하기
df.sort_values('col1', ascending=True) # 컬럼이름 & 오름차순정렬하기
df.sort_values('col1', ascending=False) # 컬럼이름 & 내림차순
# col2 컬럼 기준 오름차순 정렬 후 col1컬럼 기준 내림차순 정렬
df.sort_values(['col2', 'col1'], ascending=[True, False])
col2기준으로 오름차순으로 정렬한 뒤, col1은 col2의 오름차순 정렬을 방해하지 않는 선에서 내림차순 정렬하게 된다!
5. 집계함수 count, max, min
count 메서드를 활용하여 데이터 갯수 확인이 가능하다.
data = {
'korean' : [50, 60, 70],
'math' : [10, np.nan, 40]
}
df = pd.DataFrame(data, index = ['a', 'b', 'c'])
df.count(axis = 0) # 열 기준
df.count(axis = 1) # 행 기준
max, min 메서드를 활용하여 최대, 최솟값을 확인해보자 (default는 열기준!! nan값은 제외한다.)
data = {
'korean' : [50, 60, 70],
'math' : [10, np.nan, 40]
}
df = pd.DataFrame(data, index = ['a', 'b', 'c'])
df.max() # 최댓값
df.min() # 최솟값
sum, mean메서드 활용하여 합계 및 평균 계산해보자! (default는 열 기준!!, nan값 제외)
data = {
'korean' : [50, 60, 70],
'math' : [10, np.nan, 40]
}
df = pd.DataFrame(data, index = ['a', 'b', 'c'])
df.sum() # 합계
df.mean() # 평균
axis, skipna인자 활용하여 합계 및 평균 계산
data = {
'korean' : [50, 60, 70],
'math' : [10, np.nan, 40]
}
df = pd.DataFrame(data, index = ['a', 'b', 'c'])
df.sum(axis = 1) # 합계
df.mean(axis = 1, skipna = False) # 평균 skipna -> 값이 없으면 그 값을 skip하겠느냐?
# skipna = False는 nan을 무시하지 않고 nan을 반환하겠다는 뜻
NaN값이 존재하는 column의 평균을 구하여 NaN값 대체한다.
B_avg = df['math'].mean()
print(B_avg) # 25.0
# NaN값 대체
df['math'] = df['math'].fillna(B_avg) # fillna는 nan을 대체하는 메소드 넣기! 여기서는 평균값으로 nan값을 대체!
# 평균
df.mean(axis =1, skipna = False)
group by ; 간단한 집계를 넘어서 조건부로 집계하고 싶은 경우 사용한다!
df = pd.DataFrame({
'data1' : range(6),
'data2' : [4, 4, 6, 0, 6, 1],
'key' : ['A', 'B', 'C', 'A', 'B', 'C']
})
df.groupby('key').sum() # 1번
df.groupby(['key', 'data1']).sum() # 2번
aggregate ; groupby를 통해서 여러개의 통계함수를 한번에 계산하는 방법
df.groupby('key').aggregate(['min', np.median, max]) #1번
df.groupby('key').aggregate(['data1': 'min', 'data2': np.sum}) #2번
filter ; groupby를 통해서 그룹 속성을 기준으로 데이터 필터링
def filter_by_mean(x):
return x['data2'].mean() > 3
df.groupby('key').mean() # 1번
df.groupby('key').filter(filter_by_mean) # 2번
apply.lambda ; groupby를 통해서 묶인 데이터에 함수 적용
df.groupby('key').apply(lambda x: x.max() - x.min())
get_group ; groupby로 묶인 데이터에서 key값으로 데이터를 가져올 수 있다.
df = pd.read_csv("./univ.csv")
df.head() #상위 5개 데이터
df.groupby("시도").get_group("충남") # 데이터 추출
len(df.groupby("시도").get_group("충남")) # 94
'데이터분석' 카테고리의 다른 글
python 프로젝트! 자동차 리콜 데이터 분석을 해보자! (0) | 2021.11.23 |
---|---|
python으로 지하철 승하차 인원 데이터 분석해보기~! (0) | 2021.11.23 |
python으로 서울시 코로나 데이터 분석을 해보자! (0) | 2021.11.19 |
데이터분석 시각화에 꼭 필요한 matplotlib라이브러리 사용법에 대해서 알아보자! (0) | 2021.11.19 |