[Python.Pandas] DataFrame / Series 간 Operation 이해
2020. 12. 17. 05:00ㆍPython과 머신러닝/Pandas 데이터 분석
0. 이전 포스트
- 2020/12/15 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] Pandas 기본 - DataFrame, Series, Index의 이해
- 2020/12/16 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] DataFrame Series 추출, loc/iloc 이해하기
1. Series 간 연산 이해하기
In [1]:import pandas as pd
from pandas import Series, DataFrame
import numpy as np
In [2]:s1 = Series(range(1,6),
index= list("abced"))
s1
Out[2]:a 1
b 2
c 3
e 4
d 5
dtype: int64
In [3]:s2 = Series(range(5,11),
index=list("bcedef"))
s2
Out[3]:b 5
c 6
e 7
d 8
e 9
f 10
dtype: int64
In [4]:s1 + s2
Out[4]:a NaN
b 7.0
c 9.0
d 13.0
e 11.0
e 13.0
f NaN
dtype: float64
In [5]:s1.add(s2)
Out[5]:a NaN
b 7.0
c 9.0
d 13.0
e 11.0
e 13.0
f NaN
dtype: float64
In [6]:s1.add(s2, fill_value=0) #NaN을 0으로 처리
Out[6]:a 1.0
b 7.0
c 9.0
d 13.0
e 11.0
e 13.0
f 10.0
dtype: float64
- Series 간의 연산의 핵심 : Series의 연산은 같은 index끼리 수행된다.
- 그렇기 때문에 양쪽에 같은 index가 존재하지 않는 index에 대해서는 기본적으로 NaN(Not a number) 값으로 처리하게 되어있다.
- 이를 무시하고 0이라는 값으로 처리하고 싶을 때 fill_value Parameter를 통해서 지정할 수 있다.
- 그래서 s1+s2라는 계산식이 사용하기 쉽지만, s1.add(s2, fill_value=0)라는 형태를 좀 더 자주 사용하게 된다.
2. DataFrame 간의 연산 이해하기
In [7]:df1 = DataFrame(np.arange(9).reshape(3,3),
columns = list('abc'))
df1
Out[7]:
a b c
0 0 1 2
1 3 4 5
2 6 7 8
In [8]:df2 = DataFrame(np.arange(16).reshape(4,4),
columns = list('abcd'))
df2
Out[8]:
a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
In [9]:df1 + df2
Out[9]:
a b c d
0 0.0 2.0 4.0 NaN
1 7.0 9.0 11.0 NaN
2 14.0 16.0 18.0 NaN
3 NaN NaN NaN NaN
In [10]:df1.add(df2,
fill_value=0)
Out[10]:
a b c d
0 0.0 2.0 4.0 3.0
1 7.0 9.0 11.0 7.0
2 14.0 16.0 18.0 11.0
3 12.0 13.0 14.0 15.0
In [11]:df1.mul(df2,
fill_value=1)
Out[11]:
a b c d
0 0.0 1.0 4.0 3.0
1 12.0 20.0 30.0 7.0
2 48.0 63.0 80.0 11.0
3 12.0 13.0 14.0 15.0
- row/col의 index가 맞는 값들에 대해서만 서로 연산을 한다.
- DataFrame에서도 동일하게 없는 row/col에 대해서는 NaN으로 처리한다.
- .add, .mul 연산을 할 때 동일한 fill_value parameter를 지정해줘서 NaN 값을 처리할 수 있다.
3. DataFrame과 Series 간의 연산
In [12]:s = Series(np.arange(10,14),
index = list('abcd'))
s
Out[12]:a 10
b 11
c 12
d 13
dtype: int32
In [13]:df2 + s
Out[13]:
a b c d
0 10 12 14 16
1 14 16 18 20
2 18 20 22 24
3 22 24 26 28
In [14]:s2 = Series(np.arange(10,14))
s2
Out[14]:0 10
1 11
2 12
3 13
dtype: int32
In [15]:df2.add(s2, axis=0)
Out[15]:
a b c d
0 10 11 12 13
1 15 16 17 18
2 20 21 22 23
3 25 26 27 28
- DataFrame과 Series간의 연산은 Series의 값을 해당하는 Column의 값에 더한다(Column 별로 연산이 이뤄지는 것이 기본이다).
- 그래서 Out[13]에서도 각 Column별로 값이 10,11,12,13씩 늘어난 것을 확인할 수 있다.
- row별로 더하기 위해서는 row의 index명으로 Series의 index명을 맞춰야 하고, axis=0 parameter를 지정해줘서 row별로 값을 더할 수 있도록 해줘야 한다.
- 생각해보면, DataFrame의 값은 주로 Column 별로 수정하게 된다 (나이를 1살씩 증가시킨다던지, 모든 값들을 표준화하기 위해 평균값을 뺀다던지 등등)
- 그래서 axis=0으로 한 row의 값에 동일한 변화를 주는 일은 드물지만, 위와 같은 방법으로 수정할 수는 있다.
4. 관련 포스트
'Python과 머신러닝 > Pandas 데이터 분석' 카테고리의 다른 글
[Python.Pandas] Map 함수 실전편 + .replace함수 사용하기 (0) | 2020.12.20 |
---|---|
[Python.Pandas] Lambda함수와 Map함수 이해하기 - Series.map (0) | 2020.12.19 |
[Python.Pandas] Selection과 Drop (0) | 2020.12.18 |
[Python.Pandas] DataFrame Series 추출, loc/iloc 이해하기 (0) | 2020.12.16 |
[Python.Pandas] Pandas 기본 - DataFrame, Series, Index의 이해 (0) | 2020.12.15 |