pandas_operation

Pandas Operation

1. index가 다른 객체들의 산술연산

  • 연산: 공통인 요소에 대해서만 연산을 하고 나머지는 NaN
import pandas as pd
from pandas import Series, DataFrame
import numpy as np

1) Series 객체의 산술연산

s1 = Series([5, 6, -1, 2], index=['a', 'c', 'd', 'e'])
s1
a    5
c    6
d   -1
e    2
dtype: int64

 

s2 = Series([3, 4, -1, 2, 7], index=['a', 'c', 'e', 'f', 'g'])
s2
a    3
c    4
e   -1
f    2
g    7
dtype: int64

 

s1+s2
a     8.0
c    10.0
d     NaN
e     1.0
f     NaN
g     NaN
dtype: float64

 

2) DataFrame 객체의 산술연산

df1 = DataFrame(np.arange(9).reshape(3,3),
              columns=list('bcd'),
              index=['seoul', 'busan', 'gwangju'])
df1

b c d
seoul 0 1 2
busan 3 4 5
gwangju 6 7 8

 

df2 = DataFrame(np.arange(12).reshape(4,3),
               columns=list('bde'),
               index=['incheon', 'seoul', 'busan', 'suwon'])
df2

b d e
incheon 0 1 2
seoul 3 4 5
busan 6 7 8
suwon 9 10 11

 

df1+df2

b c d e
busan 9.0 NaN 12.0 NaN
gwangju NaN NaN NaN NaN
incheon NaN NaN NaN NaN
seoul 3.0 NaN 6.0 NaN
suwon NaN NaN NaN NaN

 

df3 = DataFrame(np.arange(12).reshape(3,4),
               columns=list('abcd'))
df3

a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11

 

df4 = DataFrame(np.arange(20).reshape(4,5),
               columns=list('abcde'))
df4

a b c d e
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19

 

df3+df4

a b c d e
0 0.0 2.0 4.0 6.0 NaN
1 9.0 11.0 13.0 15.0 NaN
2 18.0 20.0 22.0 24.0 NaN
3 NaN NaN NaN NaN NaN

 

  • 없는 값을 0으로 채운 후 연산: add 메소드와 fill_value 활용
df3.add(df4, fill_value=0)

a b c d e
0 0.0 2.0 4.0 6.0 4.0
1 9.0 11.0 13.0 15.0 9.0
2 18.0 20.0 22.0 24.0 14.0
3 15.0 16.0 17.0 18.0 19.0

 

df3.reindex(columns=df4.columns, fill_value=0)

a b c d e
0 0 1 2 3 0
1 4 5 6 7 0
2 8 9 10 11 0

 

2. DataFrame과 Series간의 연산

  • Numpy의 브로드캐스팅과 유사
arr = np.arange(12).reshape(3,4)
arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

 

arr[0]
array([0, 1, 2, 3])

 

  • 주의: 행렬의 차원이 다를때는 브로드캐스팅되어 연산됨을 주의해야 함
arr - arr[0]
array([[0, 0, 0, 0],
       [4, 4, 4, 4],
       [8, 8, 8, 8]])

 

df4 = DataFrame(np.arange(12).reshape(4,3),
               columns=list('bde'),
               index=['seoul', 'gwanju', 'daegu', 'incheon'])
df4

b d e
seoul 0 1 2
gwanju 3 4 5
daegu 6 7 8
incheon 9 10 11

 

s3 = df4.ix[0]
s3
b    0
d    1
e    2
Name: seoul, dtype: int64

 

df4-s3

b d e
seoul 0 0 0
gwanju 3 3 3
daegu 6 6 6
incheon 9 9 9

 

s4 = Series(range(3), index=list('bef'))
s4
b    0
e    1
f    2
dtype: int64

 

df4+s4

b d e f
seoul 0.0 NaN 3.0 NaN
gwanju 3.0 NaN 6.0 NaN
daegu 6.0 NaN 9.0 NaN
incheon 9.0 NaN 12.0 NaN

 

  • DataFrame의 column을 추출한 다음 연산
s5 = df4['d']
s5
seoul       1
gwanju      4
daegu       7
incheon    10
Name: d, dtype: int64

 

  • 이상한 값이 나옴
df4+s5

b d daegu e gwanju incheon seoul
seoul NaN NaN NaN NaN NaN NaN NaN
gwanju NaN NaN NaN NaN NaN NaN NaN
daegu NaN NaN NaN NaN NaN NaN NaN
incheon NaN NaN NaN NaN NaN NaN NaN

 

  • 행에 대한 연산을 수행할 경우 연산에 대한 메소드(add, sub)를 이용
df4

b d e
seoul 0 1 2
gwanju 3 4 5
daegu 6 7 8
incheon 9 10 11

 

df4.add(s5, axis=0)

b d e
seoul 1 2 3
gwanju 7 8 9
daegu 13 14 15
incheon 19 20 21

 

df4.sub(s5, axis=0)

b d e
seoul -1 0 1
gwanju -1 0 1
daegu -1 0 1
incheon -1 0 1