[Python.Pandas] DataFrame / Series 간 Operation 이해

2020. 12. 17. 05:00Python과 머신러닝/Pandas 데이터 분석

0. 이전 포스트

 

[Python.Pandas] Pandas 기본 - DataFrame, Series, Index의 이해

1. 판다스란? 판다스란 구조화된 데이터의 처리를 지원하는 python 라이브러리이다. Python 계의 엑셀이라고 표현하면 가장 정확한 표현이라고 생각한다. NumPy와 통합하여 강력한 스프레드시트 처리

coding-grandpa.tistory.com

 

[Python.Pandas] DataFrame Series 추출, loc/iloc 이해하기

1. Dict Data를 Pandas로 변환하기 In [1]:from pandas import Series, DataFrame import pandas as pd import numpy as np In [2]:raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 'last_..

coding-grandpa.tistory.com

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] Selection과 Drop

1. 원하는 Row만 선택하기 loc과 iloc 원하는 Row만 선택하기 위해서는 지난 포스트에서 정리한 loc과 iloc에 대해서 이해하는 것이 가장 중요하다. 2020/12/16 - [Python과 머신러닝/Pandas 데이터 분석] - [Pyth

coding-grandpa.tistory.com