티스토리 뷰

728x90
반응형

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
"""


728x90
반응형
댓글
반응형
250x250
글 보관함
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Total
Today
Yesterday
링크