Pandas
특징
- Easy-to-use data structure and data analysis tools
- Relational 하거나 labeled data에 대한 쉬운 접근 및 data manipulation 관련 기능 제공
- 효율적인 연산이 가능한 다차원 array 자료형 제공
Pandas에서 주로 다루는 데이터
- 테이블 형태의 데이터(주로 SQL table, csv)
- Time series 데이터
주요기능
- 결측치(missing data) 처리
- 간편한 slicing 및 indexing
- 여러 개의 데이터를 하나로 병합하는 join/merge
- 그룹화 기능
Pandas vs Numpy
- Pandas는 Numpy의 기능을 확장한 패키지
- 1-d array, 2-d array를 각각 Series와 DataFrame이라는 클래스를 사용하여 기능을 확장.
- Pandas는 data에 label을 붙임으로써 데이터에 대한 가독성을 높임
- Numpy는 결측치를 직접 찾아서 일일이 바꿔줘야 했으나, Pandas에서는 이를 간편하게 처리할 수 있음
- Element-wise broadcasting만으로는 충족할 수 없는 다양한 매핑 기능이 추가
Series
기본적인 pandas series 생성 방법
- list, 혹은 array 객체로부터 series 객체 생성
- Dictionary 객체로부터 series 객체 생성
import pandas as pd
data = pd.Series([0.25, 0.5, 0.75, 1.0])
print(data)
population_dict = {'California': 38332521, 'Texas': 26448193, 'New York': 19651127, 'Florida': 19552860,
'lllinois': 12882135}
population = pd.Series(population_dict)
print(population)
"""
0 0.25
1 0.50
2 0.75
3 1.00
dtype: float64
California 38332521
Texas 26448193
New York 19651127
Florida 19552860
lllinois 12882135
dtype: int64
"""
Series의 주요 속성
- Values : 실제 데이터를 담고 있는 컨테이너. Numpy array
- Index : array와 비슷한, RangelIndex 클래스를 사용. 실제 데이터의 위치 정보를 담고 있는 object
import pandas as pd
data = pd.Series([0.25, 0.5, 0.75, 1.0])
population_dict = {'California': 38332521, 'Texas': 26448193, 'New York': 19651127, 'Florida': 19552860,
'lllinois': 12882135}
population = pd.Series(population_dict)
print(data.values)
print(data.index)
"""
[0.25 0.5 0.75 1. ]
RangeIndex(start=0, stop=4, step=1)
"""
Index Object in Series
- 1d-array와의 가장 큰 차이점은 index를 명시적으로 정의할 수 있다는 것
- 인덱스는 연속된 값일 필요 없고, 심지어 중복 또한 혀용됨.
import pandas as pd
data = pd.Series([0.25, 0.5, 0.75, 1.0], index=['a', 'b', 'c', 'd'])
print(data[['b', 'c']])
print(data['b':'d'])
"""
b 0.50
c 0.75
dtype: float64
b 0.50
c 0.75
d 1.00
dtype: float64
"""
DataFrame
- numpy의 2-d array와 대응됨
- Series처럼 명시적 index를 갖고 있음
- 각 열이 이름을 갖고 있어, 사용자의 가독성이 array에 비해서 높음
DataFrame의 주요 속성
- Values
- Index
- Columns : index와 유사하나 행이 아닌 열에 대한 정보를 담고 있음
Creating DataFrames
- Series 객체 이용
- Numpy array 객체를 이용
- Dictionary 객체를 이용
import pandas as pd
area_dict = {'California': 423967, 'Texas': 695662, 'New York': 141297, 'Florida': 170312, 'lllinois': 149995}
area = pd.Series(area_dict)
population_dict = {'California': 38332521, 'Texas': 26448193, 'New York': 19651127, 'Florida': 19552860,
'lllinois': 12882135}
population = pd.Series(population_dict)
print(pd.DataFrame(population, columns={'population'}))
print(pd.DataFrame({'population' : population, 'area' : area}))
print(pd.DataFrame([{'a' : 1, 'b' : 2}, {'b' : 3, 'c' : 4}]))
"""
population
California 38332521
Texas 26448193
New York 19651127
Florida 19552860
lllinois 12882135
population area
California 38332521 423967
Texas 26448193 695662
New York 19651127 141297
Florida 19552860 170312
lllinois 12882135 149995
a b c
0 1.0 2 NaN
1 NaN 3 4.0
"""
Indexing / Slicing in Pandas
- 기본적으로 Numpy array에서 사용하는 indexing, slicing, masking 등 그대로 사용 가능
Column-wise selection
- dataframe['column_name']
import pandas as pd
area_dict = {'California': 423967, 'Texas': 695662, 'New York': 141297, 'Florida': 170312, 'lllinois': 149995}
area = pd.Series(area_dict)
population_dict = {'California': 38332521, 'Texas': 26448193, 'New York': 19651127, 'Florida': 19552860,
'lllinois': 12882135}
population = pd.Series(population_dict)
demo = pd.DataFrame({'population' : population, 'area' : area})
print(demo['area'])
"""
California 423967
Texas 695662
New York 141297
Florida 170312
lllinois 149995
Name: area, dtype: int64
"""
- Selection이나 연산의 결과물로 얻은 Series를 새로운 column을 생성한 뒤 할당할 수 있음
import pandas as pd
area_dict = {'California': 423967, 'Texas': 695662, 'New York': 141297, 'Florida': 170312, 'lllinois': 149995}
area = pd.Series(area_dict)
population_dict = {'California': 38332521, 'Texas': 26448193, 'New York': 19651127, 'Florida': 19552860,
'lllinois': 12882135}
population = pd.Series(population_dict)
demo = pd.DataFrame({'population' : population, 'area' : area})
demo['density'] = demo['population'] / demo['area']
print(demo)
"""
population area density
California 38332521 423967 90.413926
Texas 26448193 695662 38.018740
New York 19651127 141297 139.076746
Florida 19552860 170312 114.806121
lllinois 12882135 149995 85.883763
"""
Row-wise selection
- DataFrame에서는 data selection을 위해 iloc, loc, ix의 세 가지 함수를 지원
iloc
- 암시적 인덱스, 즉 0부터 시작하는 인덱싱을 사용하여 data를 선택
- 첫 row의 index 번호가 0이며 1씩 증가
- 첫 column의 index 번호도 마찬가지로 0이며 1씩 증가
import pandas as pd
area_dict = {'California': 423967, 'Texas': 695662, 'New York': 141297, 'Florida': 170312, 'lllinois': 149995}
area = pd.Series(area_dict)
population_dict = {'California': 38332521, 'Texas': 26448193, 'New York': 19651127, 'Florida': 19552860,
'lllinois': 12882135}
population = pd.Series(population_dict)
demo = pd.DataFrame({'population' : population, 'area' : area})
"""
population area
California 38332521 423967
Texas 26448193 695662
New York 19651127 141297
"""
loc
- 명시적 인덱스 사용
- 범위를 폐구간으로 지정
import pandas as pd
area_dict = {'California': 423967, 'Texas': 695662, 'New York': 141297, 'Florida': 170312, 'lllinois': 149995}
area = pd.Series(area_dict)
population_dict = {'California': 38332521, 'Texas': 26448193, 'New York': 19651127, 'Florida': 19552860,
'lllinois': 12882135}
population = pd.Series(population_dict)
demo = pd.DataFrame({'population' : population, 'area' : area})
demo['density'] = demo['population'] / demo['area']
demo.loc[demo.density>100] = 10
"""
population area density
California 38332521 423967 90.413926
Texas 26448193 695662 38.018740
New York 10 10 10.000000
Florida 10 10 10.000000
lllinois 12882135 149995 85.883763
"""
import pandas as pd
area_dict = {'California': 423967, 'Texas': 695662, 'New York': 141297, 'Florida': 170312, 'lllinois': 149995}
area = pd.Series(area_dict)
population_dict = {'California': 38332521, 'Texas': 26448193, 'New York': 19651127, 'Florida': 19552860,
'lllinois': 12882135}
population = pd.Series(population_dict)
demo = pd.DataFrame({'population' : population, 'area' : area})
demo['density'] = demo['population'] / demo['area']
demo.loc[demo.density>100, ['density']] = 10
print(demo)
"""
population area density
California 38332521 423967 90.413926
Texas 26448193 695662 38.018740
New York 19651127 141297 10.000000
Florida 19552860 170312 10.000000
lllinois 12882135 149995 85.883763
"""
DataFrame 연산
DataFrame과 scalar 값 간의 연산은 Broadcating을 통해 DataFrame 내 모든 item과 대응
DataFrame과 lis t 및 array간의 연산(Series도 동일). Broacasting 조건을 만족할 경우 연산이 수행
서로 다은 DataFrame간의 element-wise 연산을 지원. 이 때 index와 column이 양측에 동일하게 존재하지 않을 경우 NaN을 발생시킴.
import pandas as pd
A = pd.DataFrame([{'A' : 17, 'B' : 3}, {'A' : 17, 'B' : 11}])
B = pd.DataFrame([{'B' : 0, 'A' : 1, 'C' : 2}, {'B' : 5, 'A' : 8, 'C' : 7}, {'B' : 3, 'A' : 0, 'C' : 3}])
print(A)
print(A-2)
print(A-np.array([2, 3]))
print(A-A.iloc[0])
print(A+B)
print(A/B)
8
"""
A B
0 17 3
1 17 11
A B
0 15 1
1 15 9
A B
0 15 0
1 15 8
A B
0 0 0
1 0 8
A B C
0 18.0 3.0 NaN
1 25.0 16.0 NaN
2 NaN NaN NaN
A B C
0 17.000 inf NaN
1 2.125 2.2 NaN
2 NaN NaN NaN
"""
Aggregation in Pandas
- mean()
- describe() : 각 column의 통계량 제공
import seaborn
planets = seaborn.load_dataset('planets')
print(planets.head(n=3))
print(planets.mean())
print(planets.describe())
"""
method number orbital_period mass distance year
0 Radial Velocity 1 269.300 7.10 77.40 2006
1 Radial Velocity 1 874.774 2.21 56.95 2008
2 Radial Velocity 1 763.000 2.60 19.84 2011
number 1.785507
orbital_period 2002.917596
mass 2.638161
distance 264.069282
year 2009.070531
dtype: float64
number orbital_period mass distance year
count 1035.000000 992.000000 513.000000 808.000000 1035.000000
mean 1.785507 2002.917596 2.638161 264.069282 2009.070531
std 1.240976 26014.728304 3.818617 733.116493 3.972567
min 1.000000 0.090706 0.003600 1.350000 1989.000000
25% 1.000000 5.442540 0.229000 32.560000 2007.000000
50% 1.000000 39.979500 1.260000 55.250000 2010.000000
75% 2.000000 526.005000 3.040000 178.500000 2012.000000
max 7.000000 730000.000000 25.000000 8500.000000 2014.000000
"""