HappyWeasel

파이썬 - Pandas 1 본문

Basic/Python

파이썬 - Pandas 1

HappyWeasel 2020. 6. 6. 22:55

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

 

Series

  • numpy array가 보강된 형태 Data와 Index를 가지고 있다.
  • 즉, numpy array에 없는 index가 추가 된 것이다.
import pandas as pd
data = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
data['b']
# 2
# index가 정수가 아닐 수도 있다.

 

  • 딕셔너리로 만들 수 있다.
population_dict= {
     'korea': 5180,
     'japan': 12718,
     'china': 141500,
     'usa': 32676
     
}

population = pd.Series(population_dict)

# key가 index가 되고 value가 data가 된다.

population.values()
# numpy array로 데이터 출력

 

DataFrame

  • 여러 개의 Series가 모여서 행과 열을 이룬 데이터
import pandas as pd

population_dict = {
    'china': 141500,
    'japan': 12718,
    'korea': 5180,
    'usa': 32676
}

population = pd.Series(population_dict)

gdp_dict = {
    'china' : 1409250000,
    'korea' : 169320000,
    'japan' : 516700000,
    'usa' : 2041280000
}

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

print(country)
'''
       population         gdp
china      141500  1409250000
japan       12718   516700000
korea        5180   169320000
usa         32676  2041280000
'''


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

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

print(country['gdp'])
'''
china    1409250000
japan     516700000
korea     169320000
usa      2041280000
Name: gdp, dtype: int64
'''

print(type(country['gdp']))
'''
<class 'pandas.core.series.Series'>
'''

 

  • Series도 numpy array처럼 연산자를 사용할 수 있다.
gdp_per_capita = country['gdp'] / country['population']
country['gdp per capita'] = gdp_per_capita

print(country)
'''
       population         gdp  gdp per capita
china      141500  1409250000     9959.363958
japan       12718   516700000    40627.457147
korea        5180   169320000    32687.258687
usa         32676  2041280000    62470.314604
'''

 

저장과 불러오기

  • 만든 DataFrame을 저장 및 불러 올 수 있다.
# 저장하기
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 : 명시적인 인덱스를 참조하는 인덱싱/슬라이싱
print(country.loc['china'])
'''
population        1.415000e+05
gdp               1.409250e+09
gdp per capita    9.959364e+03
Name: china, dtype: float64
'''

print(country.loc['japan':'korea', :'population'])
'''
       population
japan       12718
korea        5180
'''

 

  • iloc : 파이썬 스타일 정수 인덱스 익덱싱/슬라이싱
print(country.loc['china'])
"""
population        1.415000e+05
gdp               1.409250e+09
gdp per capita    9.959364e+03
Name: china, dtype: float64
"""

print(country.loc['japan':'korea', :'population'])
"""
japan    40627.457147
korea    32687.258687
Name: gdp per capita, dtype: float64
"""

 

DataFrame

  • 새 데이터 추가/수정
    • 리스트로 추가하는 방법과 딕셔너리로 추가하는 방법
dataframe = pd.DataFrame(columns=['이름', '나이', '주소'])
dataframe.loc[0] = ['홍길동', '99', '서울']
dataframe.loc[1] = {'이름':'철수', '나이':'25', '주소':'인천'}

print(dataframe)
'''
    이름  나이  주소
0  홍길동  99  서울
1   철수  25  인천
'''

dataframe.loc[1, '이름'] = '영희'
print(dataframe)
'''
    이름  나이  주소
0  홍길동  99  서울
1   영희  25  인천
'''

 

  • 새로운 컬럼 추가
dataframe['전화번호'] = np.nan
# nan = Not a Number

dataframe.loc[0, '전화번호'] = '0100000000'
print(dataframe)
'''
    이름  나이  주소        전화번호
0  홍길동  99  서울  0100000000
1   영희  25  인천         NaN
'''

print(len(dataframe))
'''
2
'''

 

  • 컬럼 선택하기
    • 컬럼 이름이 하나만 있따면 Series 리스트로 들어가 있다면 DataFrame
print(dataframe["이름"])
# 이름 컬럼만 출력
'''
0    홍길동
1     영희
Name: 이름, dtype: object
'''

print(dataframe[["이름", "주소", "나이"]])
# 이름, 주소, 나이 컬럼만 출력, 대괄호가 하나 더 추가된다.
'''
0  홍길동  서울  99
1   영희  인천  25
'''

 

  • 누락된 데이터 체크
    • Nan 또는 none 데이터를 체크한다.
print(dataframe.isnull())
'''
      이름     나이     주소   전화번호
0  False  False  False  False
1  False  False  False   True
'''

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

print(dataframe.dropna())
# 비어있는 데이터는 출력하지 않는다.
'''
    이름  나이  주소        전화번호
0  홍길동  99  서울  0100000000
1   영희  25  인천         NaN

dropna() 사용 후

    이름  나이  주소        전화번호
0  홍길동  99  서울  0100000000
'''

dataframe['전화번호'] = dataframe['전화번호'].fillna('전화번호 없음')
# 전화번호 컬럼에 비어있는 데이터가 있으면 '전화번호 없음'으로 채워넣는다.

print(dataframe)
'''
    이름  나이  주소        전화번호
0  홍길동  99  서울  0100000000
1   영희  25  인천     전화번호 없음
'''

 

Series 연산

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

print(B)
'''
1    1
2    3
3    5
dtype: int64
'''

print(A+B)
# A는 0인 인덱스가 있지만 B는 없으므로 NaN이 뜬다.
'''
0    NaN
1    5.0
2    9.0
3    NaN
dtype: float64
'''

print(A.add(B, fill_value=0))
# A+B 일때 NaN이 뜨는 것을 방지하기 위해서 NaN을 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"))
print(A)
'''
   A  B
0  9  3
1  4  5
'''

print(B)
'''
   B  A  C
0  0  0  0
1  8  5  4
2  3  2  5
'''

print(A+B)
'''
     A     B   C
0  9.0   3.0 NaN
1  9.0  13.0 NaN
2  NaN   NaN NaN
'''

print(A.add(B, fill_value=0))
'''
     A     B    C
0  9.0   3.0  0.0
1  9.0  13.0  4.0
2  2.0   3.0  5.0
'''

 

집계함수

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

print(data['A'])
"""
[5, 6, 7]
"""

print(data['B'])
"""
[0, 1, 4]
"""

df = pd.DataFrame(data)
print(df['A'].sum())
"""
8
"""

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

print(df.mean)
"""
<bound method DataFrame.mean of    A  B
0  5  0
1  6  1
2  7  4>
"""

 

정렬

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)
'''
   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
'''

print(df.sort_values('col1'))
# 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
'''

print(df.sort_values('col1', ascending=False))
# ascending=False 내림차순으로 정렬 (ascending=True가 디폴트이다.)
'''
   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
'''


print(df.sort_values(['col2', 'col1']))
# 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
'''

'Basic > Python' 카테고리의 다른 글

파이썬 - Pandas 2  (1) 2020.06.29
파이썬 - Numpy  (0) 2020.06.05
파이썬 - filter  (0) 2020.06.05
파이썬 - map  (0) 2020.06.05
파이썬 - lambda  (0) 2020.06.04
Comments