본문 바로가기
  • 블랜더 거실
IT인터넷/Python

[디지털 문해력]Python으로 시작하는 데이터 분석_Pandas 기본 알아보기(210930)

by bandiburi 2021. 10. 2.

 

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

○ 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'])
data['b'] → (출력) 2

- 딕셔너리로 만들 수 있다.

population_dict = {
   'korea' : 5180, 'japan' : 12718, 'china' : 141500, 'usa' : 32676
}
population = pd.Series(population_dict)
population.values로 하면 numpy array로 나온다. 확인해 봐라


[실습1] 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")

# 국가별 인구 수 시리즈 데이터를 딕셔너리를 사용하여 만들어보세요.
population_dict = {'korea' : 5180, 'japan' : 12718, 'china' : 141500, 'usa' : 32676}
country = pd.Series(population_dict)
print(country)


○ DataFrame : 여러 개의 Series가 모여서 행과 열을 이룬 데이터

gdp_dict = { 'korea' : 16932000, 'japan' : 5167000, 'china' : 140925, 'usa' : 2041280 }
gdp = pd.Series(gdp_dict)
country = pd.DataFrame({'population' : population, 'gdp' : gdp})

country.index → (출력)  Index [ 'china', 'japan', 'korea', 'usa']
country.columns → (출력) Index(['gdp', 'population'], dtype = 'object')
country['gdp'] 
type(country['gdp']) → (출력) pandas.core.series.Series

- Series도 numpy array처럼 연산자를 쓸 수 있다.

gdp_per_capita = country['gdp'] / country['population']
country['gdp per capita'] = gdp_per_capita


○ 저장과 불러오기: 만든 프레임을 저장할 수 있다.

country.to_csv(". /country.csv")
country.to_excel("country.xlsx")
country = pd.read.csv("./country.csv")
country = pd.read.excel("country.xlsx")


[실습2] DataFrame (두번째 오답)

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(population, "\n")

print("GDP series data:")
gdp_dict = {
    'korea': 169320000,
    'japan': 516700000,
    'china': 1409250000,
    'usa': 2041280000,
}
gdp = pd.Series(gdp_dict)
print(gdp, "\n")

# 이곳에서 2개의 시리즈 값이 들어간 데이터프레임을 생성합니다.
print("Country DataFrame")
country = pd.DataFrame({'population' : population, 'gdp' : gdp})

# 데이터 프레임에 gdp per capita 칼럼을 추가하고 출력합니다.
gdp_per_capita = country['gdp'] / country['population']
country['gdp_per_capita'] = gdp_per_capita
print(country['gdp_per_capita'])

print(type(country['gdp']))
# 데이터 프레임을 만들었다면, index와 column도 각각 확인해보세요.
print(country.index)
print(country.columns)


○ Indexing / Slicing

Ioc : 명시적인 인덱스를 참조하는 Indexing/Slicing

country.loc['china']
country.loc['japan':'korea', :'population'] # population 이전의 값들을 보여달라

iloc: 파이썬 스타일 정수 인덱스 Indexing/Slicing

country.iloc[0]
country.iloc[1:3, :2] * 1~3까지지만 파이썬에서 3을 포함하지 않으므로 1~2만 (??)


○ DataFrame 새 데이터 추가 / 수정

- 리스트로 추가하는 방법과 딕셔너리로 추가하는 방법

dataframe = 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[['이름' '주소', '나이']]


[실습3] Indexing & Slicing

import numpy as np
import pandas as pd

# 첫번째 컬럼을 인덱스로 country.csv 파일 읽어오기.
print("Country DataFrame")
country = pd.read_csv("./data/country.csv", index_col=0)
print(country, "\n")

# 명시적 인덱싱을 사용하여 데이터프레임의 "china" 인덱스를 출력해봅시다.

print(country.loc['china'])

# 정수 인덱싱을 사용하여 데이터프레임의 1번째부터 3번째 인덱스를 출력해봅시다.

print(country.iloc[1:4])


○ 누락된 데이터 체크 : 튜토리얼에서 보는 데이터와 달리 현실의 데이터는 누락되어 있는 형태가 많다

dataframe.isnull() # true, false로 표현
dataframe.notnull()
dataframe.dropna()  → (출력) 비어있는 row를 삭제
dataframe['전화번호'] = dataframe['전화번호'].fillna('전화번호 없음') → (출력) 전화번호 비어있는 곳에 '전화번호 없음'으로 표기


○ 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
A.add(B, fill_value=0) # index가 없는 곳은 '0'으로 채워서 계산


○ DataFrame 연산 : +, -, *, /

A = pd.DataFrame(np.random.randint(0,10,(2,2)), columns=list("AB")) #0부터 10사이 데이타로 2x2 행렬을 만듬
B = pd.DataFrame(np.random.randint(0,10,(3,3)), columns=list("BAC"))
A+B
A.add(B, fill_value=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()
df.mean()


[실습4] pandas 연산과 함수

import numpy as np
import pandas as pd

print("A: ")
A = pd.DataFrame(np.random.randint(0, 10, (2, 2)), columns=['A', 'B'])      #칼럼이 A, B입니다.
print(A, "\n")

print("B: ")
B = pd.DataFrame(np.random.randint(0, 10, (3, 3)), columns=['B', 'A', 'C'])     #칼럼이 B, A, C입니다.
print(B, "\n")

# 아래에 다양한 연산을 자유롭게 적용해보세요.
print(A + B)
print(A.add(B,fill_value=0))


○ 값으로 정렬하기 : 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]})

df.sort_values('col1') # 지정된 칼럼 값으로 정렬됨. 기본은 오름차순
df.sort_values('col1', ascending=False) # 내림차순 정렬
df.sort_values(['col2','col1']) # col2값으로 먼저 정렬 후 col1으로 정렬


[실습5] DataFrame 정렬하기

import numpy as np
import pandas as pd

print("DataFrame: ")
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],
})
print(df, "\n")

# 정렬 코드 입력해보기    
# Q1. col1을 기준으로 오름차순으로 정렬하기.
sorted_df1 = df.sort_values('col1')
print(sorted_df1)

# Q2. col2를 기준으로 내림차순으로 정렬하기.
sorted_df2 = df.sort_values('col2', ascending=False)
print(sorted_df2)

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


[실습6] 잭이 심은 콩나무 데이터 정렬하기

from elice_utils import EliceUtils
import pandas as pd
elice_utils = EliceUtils()

def main():
# ./data/tree_data.csv 파일을 읽어서 작업해보세요!
    tree_df = pd.read_csv("./data/tree_data.csv")
#    print(len(tree_df.dropna()))
    tree_df = tree_df.sort_values("height", ascending=False)
    print(tree_df.iloc[:1])
#    print(tree_df.head(5))
 
if __name__ == "__main__":
     main()

728x90
반응형

댓글