TigerCow.Door

Pandas_clear


안녕하세요. 문범우입니다.

이번 포스팅에서는 파이썬 라이브러리인 pandas(판다스)에 대해서 알아보도록 하겠습니다.


해당 내용은 flearning의 김길호님의 강의를 바탕으로 작성되었습니다.

https://www.flearning.net/courses/6



1. Pandas 란?


Pandas는 파이썬에서 사용하는 데이터분석 라이브러리로, 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있게 되며 보다 안정적으로 대용량의 데이터들을 처리하는데 매우 편리한 도구 입니다.


먼저 pandas를 사용하기 위해서는 pandas를 설치한 이후에 아래와 같이 import를 해야 합니다.


import pandas as pd


아래 실습에서는 jupyter notebook을 사용하였습니다.



Pandas 기초

1. Pandas 란?

In [2]:
# pandas 사용하기
import numpy as np # numpy 도 함께 import
import pandas as pd

2. Pandas 자료구조

Pandas에서는 기본적으로 정의되는 자료구조인 Series와 Data Frame을 사용합니다.

이 자료구조들은 빅 데이터 분석에 있어서 높은 수준의 성능을 보여줍니다.

2-1. Series

먼저 Series에 대해서 알아보도록 하겠습니다.

In [3]:
# Series 정의하기
obj = pd.Series([4, 7, -5, 3])
obj
Out[3]:
0    4
1    7
2   -5
3    3
dtype: int64
In [4]:
# Series의 값만 확인하기
obj.values
Out[4]:
array([ 4,  7, -5,  3])
In [5]:
# Series의 인덱스만 확인하기
obj.index
Out[5]:
RangeIndex(start=0, stop=4, step=1)
In [7]:
# Series의 자료형 확인하기
obj.dtypes
Out[7]:
dtype('int64')
In [8]:
# 인덱스를 바꿀 수 있다.
obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
obj2
Out[8]:
d    4
b    7
a   -5
c    3
dtype: int64
In [10]:
# python의 dictionary 자료형을 Series data로 만들 수 있다.
# dictionary의 key가 Series의 index가 된다
sdata = {'Kim': 35000, 'Beomwoo': 67000, 'Joan': 12000, 'Choi': 4000}
obj3 = pd.Series(sdata)
obj3
Out[10]:
Kim        35000
Beomwoo    67000
Joan       12000
Choi        4000
dtype: int64
In [12]:
obj3.name = 'Salary'
obj3.index.name = "Names"
obj3
Out[12]:
Names
Kim        35000
Beomwoo    67000
Joan       12000
Choi        4000
Name: Salary, dtype: int64
In [13]:
# index 변경
obj3.index = ['A', 'B', 'C', 'D']
obj3
Out[13]:
A    35000
B    67000
C    12000
D     4000
Name: Salary, dtype: int64

2-2. Data Frame

이번에는 Data Frame에 대해서 알아보도록 하겠습니다.

In [23]:
# Data Frame 정의하기
# 이전에 DataFrame에 들어갈 데이터를 정의해주어야 하는데,
# 이는 python의 dictionary 또는 numpy의 array로 정의할 수 있다.
data = {'name': ['Beomwoo', 'Beomwoo', 'Beomwoo', 'Kim', 'Park'],
        'year': [2013, 2014, 2015, 2016, 2015],
        'points': [1.5, 1.7, 3.6, 2.4, 2.9]}
df = pd.DataFrame(data)
df
Out[23]:
name year points
0 Beomwoo 2013 1.5
1 Beomwoo 2014 1.7
2 Beomwoo 2015 3.6
3 Kim 2016 2.4
4 Park 2015 2.9
In [24]:
# 행과 열의 구조를 가진 데이터가 생긴다.
In [25]:
# 행 방향의 index
df.index
Out[25]:
RangeIndex(start=0, stop=5, step=1)
In [26]:
# 열 방향의 index
df.columns
Out[26]:
Index(['name', 'year', 'points'], dtype='object')
In [27]:
# 값 얻기
df.values
Out[27]:
array([['Beomwoo', 2013, 1.5],
       ['Beomwoo', 2014, 1.7],
       ['Beomwoo', 2015, 3.6],
       ['Kim', 2016, 2.4],
       ['Park', 2015, 2.9]], dtype=object)
In [28]:
# 각 인덱스에 대한 이름 설정하기
df.index.name = 'Num'
df.columns.name = 'Info'
df
Out[28]:
Info name year points
Num
0 Beomwoo 2013 1.5
1 Beomwoo 2014 1.7
2 Beomwoo 2015 3.6
3 Kim 2016 2.4
4 Park 2015 2.9
In [29]:
# DataFrame을 만들면서 columns와 index를 설정할 수 있다.
df2 = pd.DataFrame(data, columns=['year', 'name', 'points', 'penalty'],
                  index=['one', 'two', 'three', 'four', 'five'])
df2
Out[29]:
year name points penalty
one 2013 Beomwoo 1.5 NaN
two 2014 Beomwoo 1.7 NaN
three 2015 Beomwoo 3.6 NaN
four 2016 Kim 2.4 NaN
five 2015 Park 2.9 NaN

DataFrame을 정의하면서, data로 들어가는 python dictionary와 columns의 순서가 달라도 알아서 맞춰서 정의된다.

하지만 data에 포함되어 있지 않은 값은 NaN(Not a Number)으로 나타나게 되는데,

이는 null과 같은 개념이다.

NaN값은 추후에 어떠한 방법으로도 처리가 되지 않는 데이터이다.

따라서 올바른 데이터 처리를 위해 추가적으로 값을 넣어줘야 한다.

In [31]:
# describe() 함수는 DataFrame의 계산 가능한 값들에 대한 다양한 계산 값을 보여준다.
df2.describe()
Out[31]:
year points
count 5.000000 5.000000
mean 2014.600000 2.420000
std 1.140175 0.864292
min 2013.000000 1.500000
25% 2014.000000 1.700000
50% 2015.000000 2.400000
75% 2015.000000 2.900000
max 2016.000000 3.600000

3. DataFrame Indexing

In [33]:
data = {"names": ["Kilho", "Kilho", "Kilho", "Charles", "Charles"],
           "year": [2014, 2015, 2016, 2015, 2016],
           "points": [1.5, 1.7, 3.6, 2.4, 2.9]}
df = pd.DataFrame(data, columns=["year", "names", "points", "penalty"],
                          index=["one", "two", "three", "four", "five"])
df
Out[33]:
year names points penalty
one 2014 Kilho 1.5 NaN
two 2015 Kilho 1.7 NaN
three 2016 Kilho 3.6 NaN
four 2015 Charles 2.4 NaN
five 2016 Charles 2.9 NaN

3-1. DataFrame에서 열을 선택하고 조작하기

In [34]:
df['year']
Out[34]:
one      2014
two      2015
three    2016
four     2015
five     2016
Name: year, dtype: int64
In [36]:
# 동일한 의미를 갖는, 다른 방법
df.year
Out[36]:
one      2014
two      2015
three    2016
four     2015
five     2016
Name: year, dtype: int64
In [37]:
df[['year','points']]
Out[37]:
year points
one 2014 1.5
two 2015 1.7
three 2016 3.6
four 2015 2.4
five 2016 2.9
In [38]:
# 특정 열에 대해 위와 같이 선택하고, 우리가 원하는 값을 대입할 수 있다.
df['penalty'] = 0.5
In [39]:
df
Out[39]:
year names points penalty
one 2014 Kilho 1.5 0.5
two 2015 Kilho 1.7 0.5
three 2016 Kilho 3.6 0.5
four 2015 Charles 2.4 0.5
five 2016 Charles 2.9 0.5
In [42]:
# 또는
df['penalty'] = [0.1, 0.2, 0.3, 0.4, 0.5] # python의 List나 numpy의 array
In [43]:
df
Out[43]:
year names points penalty
one 2014 Kilho 1.5 0.1
two 2015 Kilho 1.7 0.2
three 2016 Kilho 3.6 0.3
four 2015 Charles 2.4 0.4
five 2016 Charles 2.9 0.5
In [44]:
# 새로운 열을 추가하기
df['zeros'] = np.arange(5)
In [45]:
df
Out[45]:
year names points penalty zeros
one 2014 Kilho 1.5 0.1 0
two 2015 Kilho 1.7 0.2 1
three 2016 Kilho 3.6 0.3 2
four 2015 Charles 2.4 0.4 3
five 2016 Charles 2.9 0.5 4
In [49]:
# Series를 추가할 수도 있다.
val = pd.Series([-1.2, -1.5, -1.7], index=['two','four','five'])
In [50]:
df['debt'] = val
In [51]:
df
Out[51]:
year names points penalty zeros debt
one 2014 Kilho 1.5 0.1 0 NaN
two 2015 Kilho 1.7 0.2 1 -1.2
three 2016 Kilho 3.6 0.3 2 NaN
four 2015 Charles 2.4 0.4 3 -1.5
five 2016 Charles 2.9 0.5 4 -1.7

하지만 Series로 넣을 때는 val와 같이 넣으려는 data의 index에 맞춰서 데이터가 들어간다.

이점이 python list나 numpy array로 데이터를 넣을때와 가장 큰 차이점이다.

In [52]:
df['net_points'] = df['points'] - df['penalty']
In [53]:
df['high_points'] = df['net_points'] > 2.0
In [54]:
df
Out[54]:
year names points penalty zeros debt net_points high_points
one 2014 Kilho 1.5 0.1 0 NaN 1.4 False
two 2015 Kilho 1.7 0.2 1 -1.2 1.5 False
three 2016 Kilho 3.6 0.3 2 NaN 3.3 True
four 2015 Charles 2.4 0.4 3 -1.5 2.0 False
five 2016 Charles 2.9 0.5 4 -1.7 2.4 True
In [55]:
# 열 삭제하기
del df['high_points']
In [56]:
del df['net_points']
del df['zeros']
In [57]:
df
Out[57]:
year names points penalty debt
one 2014 Kilho 1.5 0.1 NaN
two 2015 Kilho 1.7 0.2 -1.2
three 2016 Kilho 3.6 0.3 NaN
four 2015 Charles 2.4 0.4 -1.5
five 2016 Charles 2.9 0.5 -1.7
In [58]:
df.columns
Out[58]:
Index(['year', 'names', 'points', 'penalty', 'debt'], dtype='object')
In [59]:
df.index.name = 'Order'
df.columns.name = 'Info'
In [60]:
df
Out[60]:
Info year names points penalty debt
Order
one 2014 Kilho 1.5 0.1 NaN
two 2015 Kilho 1.7 0.2 -1.2
three 2016 Kilho 3.6 0.3 NaN
four 2015 Charles 2.4 0.4 -1.5
five 2016 Charles 2.9 0.5 -1.7

3-2. DataFrame에서 행을 선택하고 조작하기

pandas에서는 DataFrame에서 행을 인덱싱하는 방법이 무수히 많다.

물론 위에서 소개했던 열을 선택하는 방법도 수많은 방법중에 하나에 불과하다.

In [61]:
# 0번째 부터 2(3-1) 번째까지 가져온다.
# 뒤에 써준 숫자번째의 행은 뺀다.
df[0:3]
Out[61]:
Info year names points penalty debt
Order
one 2014 Kilho 1.5 0.1 NaN
two 2015 Kilho 1.7 0.2 -1.2
three 2016 Kilho 3.6 0.3 NaN
In [63]:
# tow라는 행부터 four라는 행까지 가져온다.
# 뒤에 써준 이름의 행을 빼지 않는다.
df['two':'four'] # 하지만 비추천!
Out[63]:
Info year names points penalty debt
Order
two 2015 Kilho 1.7 0.2 -1.2
three 2016 Kilho 3.6 0.3 NaN
four 2015 Charles 2.4 0.4 -1.5
In [65]:
# 아래 방법을 권장한다. 
# .loc 또는 .iloc 함수를 사용하는 방법.
df.loc['two'] # 반환 형태는 Series
Out[65]:
Info
year        2015
names      Kilho
points       1.7
penalty      0.2
debt        -1.2
Name: two, dtype: object
In [67]:
df.loc['two':'four']
Out[67]:
Info year names points penalty debt
Order
two 2015 Kilho 1.7 0.2 -1.2
three 2016 Kilho 3.6 0.3 NaN
four 2015 Charles 2.4 0.4 -1.5
In [69]:
df.loc['two':'four', 'points']
Out[69]:
Order
two      1.7
three    3.6
four     2.4
Name: points, dtype: float64
In [70]:
df.loc[:,'year'] # == df['year']
Out[70]:
Order
one      2014
two      2015
three    2016
four     2015
five     2016
Name: year, dtype: int64
In [71]:
df.loc[:,['year','names']]
Out[71]:
Info year names
Order
one 2014 Kilho
two 2015 Kilho
three 2016 Kilho
four 2015 Charles
five 2016 Charles
In [72]:
df.loc['three':'five','year':'penalty']
Out[72]:
Info year names points penalty
Order
three 2016 Kilho 3.6 0.3
four 2015 Charles 2.4 0.4
five 2016 Charles 2.9 0.5
In [73]:
# 새로운 행 삽입하기
df.loc['six',:] = [2013,'Jun',4.0,0.1,2.1]
In [74]:
df
Out[74]:
Info year names points penalty debt
Order
one 2014.0 Kilho 1.5 0.1 NaN
two 2015.0 Kilho 1.7 0.2 -1.2
three 2016.0 Kilho 3.6 0.3 NaN
four 2015.0 Charles 2.4 0.4 -1.5
five 2016.0 Charles 2.9 0.5 -1.7
six 2013.0 Jun 4.0 0.1 2.1
In [79]:
# .iloc 사용:: index 번호를 사용한다.
df.iloc[3] # 3번째 행을 가져온다.
Out[79]:
Info
year          2015
names      Charles
points         2.4
penalty        0.4
debt          -1.5
Name: four, dtype: object
In [80]:
df.iloc[3:5, 0:2]
Out[80]:
Info year names
Order
four 2015.0 Charles
five 2016.0 Charles
In [81]:
df.iloc[[0,1,3], [1,2]]
Out[81]:
Info names points
Order
one Kilho 1.5
two Kilho 1.7
four Charles 2.4
In [83]:
df.iloc[:,1:4]
Out[83]:
Info names points penalty
Order
one Kilho 1.5 0.1
two Kilho 1.7 0.2
three Kilho 3.6 0.3
four Charles 2.4 0.4
five Charles 2.9 0.5
six Jun 4.0 0.1
In [84]:
df.iloc[1,1]
Out[84]:
'Kilho'

4. DataFrame에서의 boolean Indexing

In [85]:
df
Out[85]:
Info year names points penalty debt
Order
one 2014.0 Kilho 1.5 0.1 NaN
two 2015.0 Kilho 1.7 0.2 -1.2
three 2016.0 Kilho 3.6 0.3 NaN
four 2015.0 Charles 2.4 0.4 -1.5
five 2016.0 Charles 2.9 0.5 -1.7
six 2013.0 Jun 4.0 0.1 2.1
In [87]:
# year가 2014보다 큰 boolean data
df['year'] > 2014
Out[87]:
Order
one      False
two       True
three     True
four      True
five      True
six      False
Name: year, dtype: bool
In [89]:
# year가 2014보다 큰 모든 행의 값
df.loc[df['year']>2014,:]
Out[89]:
Info year names points penalty debt
Order
two 2015.0 Kilho 1.7 0.2 -1.2
three 2016.0 Kilho 3.6 0.3 NaN
four 2015.0 Charles 2.4 0.4 -1.5
five 2016.0 Charles 2.9 0.5 -1.7
In [90]:
df.loc[df['names'] == 'Kilho',['names','points']]
Out[90]:
Info names points
Order
one Kilho 1.5
two Kilho 1.7
three Kilho 3.6
In [92]:
# numpy에서와 같이 논리연산을 응용할 수 있다.
df.loc[(df['points']>2)&(df['points']<3),:]
Out[92]:
Info year names points penalty debt
Order
four 2015.0 Charles 2.4 0.4 -1.5
five 2016.0 Charles 2.9 0.5 -1.7
In [93]:
# 새로운 값을 대입할 수도 있다.
df.loc[df['points'] > 3, 'penalty'] = 0
In [94]:
df
Out[94]:
Info year names points penalty debt
Order
one 2014.0 Kilho 1.5 0.1 NaN
two 2015.0 Kilho 1.7 0.2 -1.2
three 2016.0 Kilho 3.6 0.0 NaN
four 2015.0 Charles 2.4 0.4 -1.5
five 2016.0 Charles 2.9 0.5 -1.7
six 2013.0 Jun 4.0 0.0 2.1

5. Data

In [95]:
# DataFrame을 만들때 index, column을 설정하지 않으면 기본값으로 0부터 시작하는 정수형 숫자로 입력된다.
df = pd.DataFrame(np.random.randn(6,4))
df
Out[95]:
0 1 2 3
0 0.682000 -0.570393 -1.602829 -1.316469
1 -1.176203 0.171527 0.387018 1.027615
2 -0.263178 -0.212049 1.006856 0.096111
3 2.679378 0.347145 0.548144 0.826258
4 -0.249877 0.018721 -0.393715 0.302361
5 0.851420 -0.440360 -0.345895 1.055936
In [98]:
df.columns = ['A', 'B', 'C', 'D']
df.index = pd.date_range('20160701', periods=6)
#pandas에서 제공하는 date range함수는 datetime 자료형으로 구성된, 날짜 시각등을 알 수 있는 자료형을 만드는 함수
df.index
Out[98]:
DatetimeIndex(['2016-07-01', '2016-07-02', '2016-07-03', '2016-07-04',
               '2016-07-05', '2016-07-06'],
              dtype='datetime64[ns]', freq='D')
In [99]:
df
Out[99]:
A B C D
2016-07-01 0.682000 -0.570393 -1.602829 -1.316469
2016-07-02 -1.176203 0.171527 0.387018 1.027615
2016-07-03 -0.263178 -0.212049 1.006856 0.096111
2016-07-04 2.679378 0.347145 0.548144 0.826258
2016-07-05 -0.249877 0.018721 -0.393715 0.302361
2016-07-06 0.851420 -0.440360 -0.345895 1.055936
In [101]:
# np.nan은 NaN값을 의미한다.
df['F'] = [1.0, np.nan, 3.5, 6.1, np.nan, 7.0]
df
Out[101]:
A B C D F
2016-07-01 0.682000 -0.570393 -1.602829 -1.316469 1.0
2016-07-02 -1.176203 0.171527 0.387018 1.027615 NaN
2016-07-03 -0.263178 -0.212049 1.006856 0.096111 3.5
2016-07-04 2.679378 0.347145 0.548144 0.826258 6.1
2016-07-05 -0.249877 0.018721 -0.393715 0.302361 NaN
2016-07-06 0.851420 -0.440360 -0.345895 1.055936 7.0

NaN 없애기

In [102]:
# 행의 값중 하나라도 nan인 경우 그 행을 없앤다.
df.dropna(how='any') 
Out[102]:
A B C D F
2016-07-01 0.682000 -0.570393 -1.602829 -1.316469 1.0
2016-07-03 -0.263178 -0.212049 1.006856 0.096111 3.5
2016-07-04 2.679378 0.347145 0.548144 0.826258 6.1
2016-07-06 0.851420 -0.440360 -0.345895 1.055936 7.0
In [103]:
# 행의 값의 모든 값이 nan인 경우 그 행으 없앤다.
df.dropna(how='all')
Out[103]:
A B C D F
2016-07-01 0.682000 -0.570393 -1.602829 -1.316469 1.0
2016-07-02 -1.176203 0.171527 0.387018 1.027615 NaN
2016-07-03 -0.263178 -0.212049 1.006856 0.096111 3.5
2016-07-04 2.679378 0.347145 0.548144 0.826258 6.1
2016-07-05 -0.249877 0.018721 -0.393715 0.302361 NaN
2016-07-06 0.851420 -0.440360 -0.345895 1.055936 7.0

주의 drop함수는 특정 행 또는 열을 drop하고난 DataFrame을 반환한다.

즉, 반환을 받지 않으면 기존의 DataFrame은 그대로이다.

아니면, inplace=True라는 인자를 추가하여, 반환을 받지 않고서도

기존의 DataFrame이 변경되도록 한다.

In [104]:
# nan값에 값 넣기
df.fillna(value=0.5)
Out[104]:
A B C D F
2016-07-01 0.682000 -0.570393 -1.602829 -1.316469 1.0
2016-07-02 -1.176203 0.171527 0.387018 1.027615 0.5
2016-07-03 -0.263178 -0.212049 1.006856 0.096111 3.5
2016-07-04 2.679378 0.347145 0.548144 0.826258 6.1
2016-07-05 -0.249877 0.018721 -0.393715 0.302361 0.5
2016-07-06 0.851420 -0.440360 -0.345895 1.055936 7.0
In [107]:
# nan값인지 확인하기
df.isnull()
Out[107]:
A B C D F
2016-07-01 False False False False False
2016-07-02 False False False False True
2016-07-03 False False False False False
2016-07-04 False False False False False
2016-07-05 False False False False True
2016-07-06 False False False False False
In [109]:
# F열에서 nan값을 포함하는 행만 추출하기
df.loc[df.isnull()['F'],:]
Out[109]:
A B C D F
2016-07-02 -1.176203 0.171527 0.387018 1.027615 NaN
2016-07-05 -0.249877 0.018721 -0.393715 0.302361 NaN
In [110]:
pd.to_datetime('20160701')
Out[110]:
Timestamp('2016-07-01 00:00:00')
In [111]:
# 특정 행 drop하기
df.drop(pd.to_datetime('20160701'))
Out[111]:
A B C D F
2016-07-02 -1.176203 0.171527 0.387018 1.027615 NaN
2016-07-03 -0.263178 -0.212049 1.006856 0.096111 3.5
2016-07-04 2.679378 0.347145 0.548144 0.826258 6.1
2016-07-05 -0.249877 0.018721 -0.393715 0.302361 NaN
2016-07-06 0.851420 -0.440360 -0.345895 1.055936 7.0
In [112]:
# 2개 이상도 가능
df.drop([pd.to_datetime('20160702'),pd.to_datetime('20160704')])
Out[112]:
A B C D F
2016-07-01 0.682000 -0.570393 -1.602829 -1.316469 1.0
2016-07-03 -0.263178 -0.212049 1.006856 0.096111 3.5
2016-07-05 -0.249877 0.018721 -0.393715 0.302361 NaN
2016-07-06 0.851420 -0.440360 -0.345895 1.055936 7.0
In [113]:
# 특정 열 삭제하기
df.drop('F', axis = 1)
Out[113]:
A B C D
2016-07-01 0.682000 -0.570393 -1.602829 -1.316469
2016-07-02 -1.176203 0.171527 0.387018 1.027615
2016-07-03 -0.263178 -0.212049 1.006856 0.096111
2016-07-04 2.679378 0.347145 0.548144 0.826258
2016-07-05 -0.249877 0.018721 -0.393715 0.302361
2016-07-06 0.851420 -0.440360 -0.345895 1.055936
In [114]:
# 2개 이상의 열도 가능
df.drop(['B','D'], axis = 1)
Out[114]:
A C F
2016-07-01 0.682000 -1.602829 1.0
2016-07-02 -1.176203 0.387018 NaN
2016-07-03 -0.263178 1.006856 3.5
2016-07-04 2.679378 0.548144 6.1
2016-07-05 -0.249877 -0.393715 NaN
2016-07-06 0.851420 -0.345895 7.0

6. Data 분석용 함수들

In [115]:
data = [[1.4, np.nan],
           [7.1, -4.5],
        [np.nan, np.nan],
        [0.75, -1.3]]
df = pd.DataFrame(data, columns=["one", "two"], index=["a", "b", "c", "d"])
In [116]:
df
Out[116]:
one two
a 1.40 NaN
b 7.10 -4.5
c NaN NaN
d 0.75 -1.3
In [118]:
# 행방향으로의 합(즉, 각 열의 합)
df.sum(axis=0)
Out[118]:
one    9.25
two   -5.80
dtype: float64
In [119]:
# 열방향으로의 합(즉, 각 행의 합)
df.sum(axis=1)
Out[119]:
a    1.40
b    2.60
c    0.00
d   -0.55
dtype: float64

이때, 위에서 볼 수 있듯이 NaN값은 배제하고 계산한다.

NaN 값을 배제하지 않고 계산하려면 아래와 같이 skipna에 대해 false를 지정해준다.

In [123]:
df.sum(axis=1, skipna=False)
Out[123]:
a     NaN
b    2.60
c     NaN
d   -0.55
dtype: float64
In [120]:
# 특정 행 또는 특정 열에서만 계산하기
df['one'].sum()
Out[120]:
9.25
In [121]:
df.loc['b'].sum()
Out[121]:
2.5999999999999996

pandas에서 DataFrame에 적용되는 함수들

sum() 함수 이외에도 pandas에서 DataFrame에 적용되는 함수는 다음의 것들이 있다.

count 전체 성분의 (NaN이 아닌) 값의 갯수를 계산

min, max 전체 성분의 최솟, 최댓값을 계산

argmin, argmax 전체 성분의 최솟값, 최댓값이 위치한 (정수)인덱스를 반환

idxmin, idxmax 전체 인덱스 중 최솟값, 최댓값을 반환

quantile 전체 성분의 특정 사분위수에 해당하는 값을 반환 (0~1 사이)

sum 전체 성분의 합을 계산

mean 전체 성분의 평균을 계산

median 전체 성분의 중간값을 반환

mad 전체 성분의 평균값으로부터의 절대 편차(absolute deviation)의 평균을 계산

std, var 전체 성분의 표준편차, 분산을 계산

cumsum 맨 첫 번째 성분부터 각 성분까지의 누적합을 계산 (0에서부터 계속 더해짐)

cumprod 맨 첫번째 성분부터 각 성분까지의 누적곱을 계산 (1에서부터 계속 곱해짐)

In [125]:
df2 = pd.DataFrame(np.random.randn(6, 4),
                   columns=["A", "B", "C", "D"],
                   index=pd.date_range("20160701", periods=6))
df2
Out[125]:
A B C D
2016-07-01 1.024359 0.213159 0.277114 -0.304599
2016-07-02 -1.693934 0.619885 -1.620676 0.067814
2016-07-03 -0.216422 0.659557 0.342833 -0.141637
2016-07-04 -0.873492 0.669932 -0.515944 0.280424
2016-07-05 -0.923094 -1.174652 2.678657 -0.663322
2016-07-06 -1.580576 0.539906 -1.900090 -0.428551
In [127]:
# A열과 B열의 상관계수 구하기
df2['A'].corr(df2['B'])
Out[127]:
-0.06715327766901227
In [128]:
# B열과 C열의 공분산 구하기
df2['B'].cov(df2['C'])
Out[128]:
-1.0099019967454226

정렬함수 및 기타함수

In [130]:
dates = df2.index
random_dates = np.random.permutation(dates)
df2 = df2.reindex(index=random_dates, columns=["D", "B", "C", "A"])
df2
Out[130]:
D B C A
2016-07-02 0.067814 0.619885 -1.620676 -1.693934
2016-07-06 -0.428551 0.539906 -1.900090 -1.580576
2016-07-03 -0.141637 0.659557 0.342833 -0.216422
2016-07-01 -0.304599 0.213159 0.277114 1.024359
2016-07-05 -0.663322 -1.174652 2.678657 -0.923094
2016-07-04 0.280424 0.669932 -0.515944 -0.873492
In [131]:
# index와 column의 순서가 섞여있다.
# 이때 index가 오름차순이 되도록 정렬해보자
df2.sort_index(axis=0)
Out[131]:
D B C A
2016-07-01 -0.304599 0.213159 0.277114 1.024359
2016-07-02 0.067814 0.619885 -1.620676 -1.693934
2016-07-03 -0.141637 0.659557 0.342833 -0.216422
2016-07-04 0.280424 0.669932 -0.515944 -0.873492
2016-07-05 -0.663322 -1.174652 2.678657 -0.923094
2016-07-06 -0.428551 0.539906 -1.900090 -1.580576
In [132]:
# column을 기준으로?
df2.sort_index(axis=1)
Out[132]:
A B C D
2016-07-02 -1.693934 0.619885 -1.620676 0.067814
2016-07-06 -1.580576 0.539906 -1.900090 -0.428551
2016-07-03 -0.216422 0.659557 0.342833 -0.141637
2016-07-01 1.024359 0.213159 0.277114 -0.304599
2016-07-05 -0.923094 -1.174652 2.678657 -0.663322
2016-07-04 -0.873492 0.669932 -0.515944 0.280424
In [134]:
# 내림차순으로는?
df2.sort_index(axis=1, ascending=False)
Out[134]:
D C B A
2016-07-02 0.067814 -1.620676 0.619885 -1.693934
2016-07-06 -0.428551 -1.900090 0.539906 -1.580576
2016-07-03 -0.141637 0.342833 0.659557 -0.216422
2016-07-01 -0.304599 0.277114 0.213159 1.024359
2016-07-05 -0.663322 2.678657 -1.174652 -0.923094
2016-07-04 0.280424 -0.515944 0.669932 -0.873492
In [135]:
# 값 기준 정렬하기
# D열의 값이 오름차순이 되도록 정렬하기
df2.sort_values(by='D')
Out[135]:
D B C A
2016-07-05 -0.663322 -1.174652 2.678657 -0.923094
2016-07-06 -0.428551 0.539906 -1.900090 -1.580576
2016-07-01 -0.304599 0.213159 0.277114 1.024359
2016-07-03 -0.141637 0.659557 0.342833 -0.216422
2016-07-02 0.067814 0.619885 -1.620676 -1.693934
2016-07-04 0.280424 0.669932 -0.515944 -0.873492
In [136]:
# B열의 값이 내림차순이 되도록 정렬하기
df2.sort_values(by='B', ascending=False)
Out[136]:
D B C A
2016-07-04 0.280424 0.669932 -0.515944 -0.873492
2016-07-03 -0.141637 0.659557 0.342833 -0.216422
2016-07-02 0.067814 0.619885 -1.620676 -1.693934
2016-07-06 -0.428551 0.539906 -1.900090 -1.580576
2016-07-01 -0.304599 0.213159 0.277114 1.024359
2016-07-05 -0.663322 -1.174652 2.678657 -0.923094
In [138]:
df2["E"] = np.random.randint(0, 6, size=6)
df2["F"] = ["alpha", "beta", "gamma", "gamma", "alpha", "gamma"]
df2
Out[138]:
D B C A E F
2016-07-02 0.067814 0.619885 -1.620676 -1.693934 1 alpha
2016-07-06 -0.428551 0.539906 -1.900090 -1.580576 1 beta
2016-07-03 -0.141637 0.659557 0.342833 -0.216422 3 gamma
2016-07-01 -0.304599 0.213159 0.277114 1.024359 4 gamma
2016-07-05 -0.663322 -1.174652 2.678657 -0.923094 5 alpha
2016-07-04 0.280424 0.669932 -0.515944 -0.873492 0 gamma
In [139]:
# E열과 F열을 동시에 고려하여, 오름차순으로 하려면?
df2.sort_values(by=['E','F'])
Out[139]:
D B C A E F
2016-07-04 0.280424 0.669932 -0.515944 -0.873492 0 gamma
2016-07-02 0.067814 0.619885 -1.620676 -1.693934 1 alpha
2016-07-06 -0.428551 0.539906 -1.900090 -1.580576 1 beta
2016-07-03 -0.141637 0.659557 0.342833 -0.216422 3 gamma
2016-07-01 -0.304599 0.213159 0.277114 1.024359 4 gamma
2016-07-05 -0.663322 -1.174652 2.678657 -0.923094 5 alpha
In [140]:
# 지정한 행 또는 열에서 중복값을 제외한 유니크한 값만 얻기
df2['F'].unique()
Out[140]:
array(['alpha', 'beta', 'gamma'], dtype=object)
In [142]:
# 지정한 행 또는 열에서 값에 따른 개수 얻기
df2['F'].value_counts()
Out[142]:
gamma    3
alpha    2
beta     1
Name: F, dtype: int64
In [144]:
# 지정한 행 또는 열에서 입력한 값이 있는지 확인하기
df2['F'].isin(['alpha','beta'])
# 아래와 같이 응용할 수 있다.
Out[144]:
2016-07-02     True
2016-07-06     True
2016-07-03    False
2016-07-01    False
2016-07-05     True
2016-07-04    False
Name: F, dtype: bool
In [146]:
# F열의 값이 alpha나 beta인 모든 행 구하기
df2.loc[df2['F'].isin(['alpha','beta']),:]
Out[146]:
D B C A E F
2016-07-02 0.067814 0.619885 -1.620676 -1.693934 1 alpha
2016-07-06 -0.428551 0.539906 -1.900090 -1.580576 1 beta
2016-07-05 -0.663322 -1.174652 2.678657 -0.923094 5 alpha

사용자가 직접 만든 함수를 적용하기

In [149]:
df3 = pd.DataFrame(np.random.randn(4, 3), columns=["b", "d", "e"],
                   index=["Seoul", "Incheon", "Busan", "Daegu"])
df3
Out[149]:
b d e
Seoul 0.806401 -0.101789 -0.201956
Incheon 0.666876 -2.144428 -0.013760
Busan 1.811228 0.225317 1.445495
Daegu -0.608445 0.128199 -0.325935
In [150]:
func = lambda x: x.max() - x.min()
In [151]:
df3.apply(func, axis=0)
Out[151]:
b    2.419673
d    2.369745
e    1.771431
dtype: float64
블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc