<aside> 💡 기본적으로 판다스 객체들의 산술연산은 정렬 → 대응 → 연산 과정을 거친다. 대응되는 원소들이 없다면 NaN으로 처리하게 된다. NaN은 fill_values옵션으로 초기화가능하다.

</aside>

시리즈 연산

시리즈 vs 숫자

직관적으로 이해가능하다.

import pandas as pd

coord_data = {
    "x": 20,
    "y": 40,
    "z": 30
}

coord = pd.Series(coord_data)

print("< Original Coord >")
print(coord)

coord = coord + 20
print("\\n< +20 >")
print(coord)
< Original Coord >
x    20
y    40
z    30
dtype: int64

< +20 >
x    40
y    60
z    50
dtype: int64

시리즈 vs 시리즈

import pandas as pd

A_coord_data = {
    "x": 20,
    "y": 40,
    "z": 30
}

B_coord_data = {
    "x": 10,
    "y": -30,
    "z": -10,
    "t": 300
}

A_sr = pd.Series(A_coord_data)
B_sr = pd.Series(B_coord_data)
C_sr = A_sr + B_sr

print(C_sr)
t     NaN
x    30.0
y    10.0
z    20.0
dtype: float64

연산메서드

NaN은 fill_values로 처리해 줄 수 있다. 이 경우 연산을 연산자가 아니라 메서드로 해주면 된다.

import pandas as pd

A_coord_data = {
    "x": 20,
    "y": 40,
    "z": 30
}

B_coord_data = {
    "x": 10,
    "y": -30,
    "z": -10,
    "t": 300,
    "s": 200
}

A_sr = pd.Series(A_coord_data)
B_sr = pd.Series(B_coord_data)

r0 = A_sr.add(B_sr, fill_value=0)
r1 = A_sr.sub(B_sr, fill_value=0)
r2 = A_sr.mul(B_sr, fill_value=0)
r3 = A_sr.div(B_sr, fill_value=0)

result = pd.DataFrame([r0, r1, r2, r3],
                      index=["add", "sub", "mul", "div"])
print(result)
				 s      t      x            y      z        
add  200.0  300.0   30.0    10.000000   20.0        
sub -200.0 -300.0   10.0    70.000000   40.0        
mul    0.0    0.0  200.0 -1200.000000 -300.0        
div    0.0    0.0    2.0    -1.333333   -3.0

데이터프레임 연산

데이터프레임 vs 숫자

데이터프레임 vs 데이터프레임

이 역시 직관적으로 이해가능하다.

import pandas as pd

col = ["X", "Y", "Z"]
row = ["A", "B", "C"]

coord_data1 = [
    [1, 4, 3],
    [3, 1, 7],
    [2, 0, 3]
]
coord_data2 = [
    [-1, -1, 1],
    [0, 3, 1],
    [-2, -1, 0]
]

df1 = pd.DataFrame(coord_data1, index=row, columns=col)
df2 = pd.DataFrame(coord_data2, index=row, columns=col)
print("DataFrame + number\\n")
print(df1 + 100)
print()
print(df1 - 100)
print()
print(df1 * 100)
print()
print(df1 / 100)

print("\\nDataFrame + DataFrame\\n")
print(df1 + df2)
print()
print(df1 - df2)
print()
print(df1 * df2)
print()
print(df1 / df2)