데이터프레임의 산술연산


1
import pandas as pd
1
import numpy as np

예제 DataFrame 생성

1
df = pd.DataFrame({"통계": [60, 70, 80, 85, 75], "미술": [50, 55, 80, 100, 95], "체육": [70, 65, 50, 95, 100] })
1
df
통계 미술 체육
0 60 50 70
1 70 55 65
2 80 80 50
3 85 100 95
4 75 95 100


1. Column 과 Column 간 연산 (+, -, *, /, %)

1
type(df["통계"])
pandas.core.series.Series

즉 Series 과 Series 간의 연산


1
df["통계"] + df["미술"] + df["체육"]
0    180
1    190
2    210
3    280
4    270
dtype: int64

1
df["통계"] - df["미술"]
0    10
1    15
2     0
3   -15
4   -20
dtype: int64

1
df["통계"] * df["미술"]
0    3000
1    3850
2    6400
3    8500
4    7125
dtype: int64

1
df["통계"] / df["미술"]
0    1.200000
1    1.272727
2    1.000000
3    0.850000
4    0.789474
dtype: float64

1
df["통계"] % df["미술"]
0    10
1    15
2     0
3    85
4    75
dtype: int64



2. Column 과 숫자 간 연산 (+, -, *, /, %)

1
df["통계"]
0    60
1    70
2    80
3    85
4    75
Name: 통계, dtype: int64

1
df["통계"] + 10
0    70
1    80
2    90
3    95
4    85
Name: 통계, dtype: int64

1
df["통계"] - 10
0    50
1    60
2    70
3    75
4    65
Name: 통계, dtype: int64

1
df["통계"] * 10
0    600
1    700
2    800
3    850
4    750
Name: 통계, dtype: int64

1
df["통계"] / 10
0    6.0
1    7.0
2    8.0
3    8.5
4    7.5
Name: 통계, dtype: float64

1
df["통계"] % 10
0    0
1    0
2    0
3    5
4    5
Name: 통계, dtype: int64


3. 복합 연산

1
df = pd.DataFrame({"통계": [60, 70, 80, 85, 75], "미술": [50, 55, 80, 100, 95], "체육": [70, 65, 50, 95, 100] })
1
df
통계 미술 체육
0 60 50 70
1 70 55 65
2 80 80 50
3 85 100 95
4 75 95 100

1
df["통계미술+10"] = df["통계"] + df["미술"] + 10
1
df
통계 미술 체육 통계미술+10
0 60 50 70 120
1 70 55 65 135
2 80 80 50 170
3 85 100 95 195
4 75 95 100 180

1
df["통계"] + df["미술"] - df["체육"]
0     40
1     60
2    110
3     90
4     70
dtype: int64


4. mean(), sum() 을 axis 기준으로 연산

1
df = pd.DataFrame({"통계": [60, 70, 80, 85, 75], "미술": [50, 55, 80, 100, 95], "체육": [70, 65, 50, 95, 100] })
1
df
통계 미술 체육
0 60 50 70
1 70 55 65
2 80 80 50
3 85 100 95
4 75 95 100

(1) 각 column의 모든 row 값의 합 구하기

1
df.sum(axis = 0)
통계    370
미술    380
체육    380
dtype: int64

(2) 각 column의 모든 row 값의 평균 구하기

1
df.mean(axis = 0)
통계    74.0
미술    76.0
체육    76.0
dtype: float64

(3) 각 row의 모든 column 값의 합 구하기

1
df.sum(axis = 1)
0    180
1    190
2    210
3    280
4    270
dtype: int64

(4) 각 row의 모든 column 값의 평균 구하기

1
df.mean(axis = 1)
0    60.000000
1    63.333333
2    70.000000
3    93.333333
4    90.000000
dtype: float64


5. NaN 값이 존재할 경우 연산

NaN 값이 포함된 모든 연산의 결과가 다 NaN 값이다


1
df = pd.DataFrame({"통계": [60, np.nan, 80, 85, 75], "미술": [50, 55, np.nan, 100, 95], "체육": [70, 65, 50, 95, np.nan] })
1
df
통계 미술 체육
0 60.0 50.0 70.0
1 NaN 55.0 65.0
2 80.0 NaN 50.0
3 85.0 100.0 95.0
4 75.0 95.0 NaN

1
df["통계"] / 2
0    30.0
1     NaN
2    40.0
3    42.5
4    37.5
Name: 통계, dtype: float64

1
1000 / df["통계"]
0    16.666667
1          NaN
2    12.500000
3    11.764706
4    13.333333
Name: 통계, dtype: float64

1
df["통계"] / np.nan
0   NaN
1   NaN
2   NaN
3   NaN
4   NaN
Name: 통계, dtype: float64

1
np.nan / df["통계"]
0   NaN
1   NaN
2   NaN
3   NaN
4   NaN
Name: 통계, dtype: float64


6. DataFrame 과 DataFrame 간 연산

6-1. 문자열이 포함된 Series / DataFrame의 연산은 불가하다

1
df1 = pd.DataFrame({'통계': [60, 70, 80, 85, 75], '미술': [50, 55, 80, 100, 95], '체육': [70, 65, 50, 95, 100] })
1
df2 = pd.DataFrame({'통계': ['good', 'bad', 'ok' , 'good', 'ok'], '미술': [50, 60 , 80, 100, 95], '체육': [70, 65, 50, 70 , 100] })
1
df1
통계 미술 체육
0 60 50 70
1 70 55 65
2 80 80 50
3 85 100 95
4 75 95 100

1
df2
통계 미술 체육
0 good 50 70
1 bad 60 65
2 ok 80 50
3 good 100 70
4 ok 95 100

1
df1 + df2
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

D:\Anaconda\lib\site-packages\pandas\core\ops\array_ops.py in na_arithmetic_op(left, right, op, str_rep)
    148     try:
--> 149         result = expressions.evaluate(op, str_rep, left, right)
    150     except TypeError:


D:\Anaconda\lib\site-packages\pandas\core\computation\expressions.py in evaluate(op, op_str, a, b, use_numexpr)
    207     if use_numexpr:
--> 208         return _evaluate(op, op_str, a, b)
    209     return _evaluate_standard(op, op_str, a, b)


D:\Anaconda\lib\site-packages\pandas\core\computation\expressions.py in _evaluate_numexpr(op, op_str, a, b)
    120     if result is None:
--> 121         result = _evaluate_standard(op, op_str, a, b)
    122 


D:\Anaconda\lib\site-packages\pandas\core\computation\expressions.py in _evaluate_standard(op, op_str, a, b)
     69     with np.errstate(all="ignore"):
---> 70         return op(a, b)
     71 


TypeError: unsupported operand type(s) for +: 'int' and 'str'

1
df2 + 10
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

D:\Anaconda\lib\site-packages\pandas\core\ops\array_ops.py in na_arithmetic_op(left, right, op, str_rep)
    148     try:
--> 149         result = expressions.evaluate(op, str_rep, left, right)
    150     except TypeError:


D:\Anaconda\lib\site-packages\pandas\core\computation\expressions.py in evaluate(op, op_str, a, b, use_numexpr)
    207     if use_numexpr:
--> 208         return _evaluate(op, op_str, a, b)
    209     return _evaluate_standard(op, op_str, a, b)


D:\Anaconda\lib\site-packages\pandas\core\computation\expressions.py in _evaluate_numexpr(op, op_str, a, b)
    120     if result is None:
--> 121         result = _evaluate_standard(op, op_str, a, b)
    122 


D:\Anaconda\lib\site-packages\pandas\core\computation\expressions.py in _evaluate_standard(op, op_str, a, b)
     69     with np.errstate(all="ignore"):
---> 70         return op(a, b)
     71 


TypeError: can only concatenate str (not "int") to str


6-2. 두 DataFrame의 column 이름은 같으나 column 순서만 바뀌어 있는 경우

연산시 자동으로 column 이름 기준으로 연산 된다


1
2
df1 = pd.DataFrame({'미술': [10, 20, 30, 40, 50], '통계':[60, 70, 80, 90, 100] })
df2 = pd.DataFrame({'통계': [10, 20, 30, 40, 50], '미술': [60, 70, 80, 90, 100] })
1
df1
미술 통계
0 10 60
1 20 70
2 30 80
3 40 90
4 50 100

1
df2
통계 미술
0 10 60
1 20 70
2 30 80
3 40 90
4 50 100

1
df1 + df2
미술 통계
0 70 70
1 90 90
2 110 110
3 130 130
4 150 150


6-3. 행의 갯수가 다른 경우

행 index 기준으로 연산하되, 하나의 DataFrame에만 존재하는 행은 연산결과가 NaN으로 나옴


1
2
df1 = pd.DataFrame({'미술': [10, 20, 30, 40, 50, 60], '통계':[60, 70, 80, 90, 100, 110] })
df2 = pd.DataFrame({'통계': [10, 20, 30, 40, 50], '미술': [60, 70, 80, 90, 100] })
1
df1
미술 통계
0 10 60
1 20 70
2 30 80
3 40 90
4 50 100
5 60 110

1
df2
통계 미술
0 10 60
1 20 70
2 30 80
3 40 90
4 50 100

1
df1 * df2
미술 통계
0 600.0 600.0
1 1400.0 1400.0
2 2400.0 2400.0
3 3600.0 3600.0
4 5000.0 5000.0
5 NaN NaN