Programming/Python(파이썬)
[Python-Numpy]-combining #3
yul_S2
2022. 11. 11. 12:28
반응형
combining
▷
벡터화된 if-else 구문을 표현하는 NumPy 의 where()함수
a = pd.Series([np.nan, 2.5, np.nan, 3.5, 4.5, np.nan],
index=['f', 'e', 'd', 'c', 'b', 'a'])
b = pd.Series(np.arange(len(a), dtype=np.float64),
index=['f', 'e', 'd', 'c', 'b', 'a'])
b[-1] = np.nan
a
# <출력>
# f NaN
# e 2.5
# d NaN
# c 3.5
# b 4.5
# a NaN
# dtype: float64
b
# <출력>
# f 0.0
# e 1.0
# d 2.0
# c 3.0
# b 4.0
# a NaN
# dtype: float64
▷
null 이면 b, 아니면 a
np.where(pd.isnull(a), b, a)
# <출력>
# array([0. , 2.5, 2. , 3.5, 4.5, nan])
▷
combine_first 메서드는 위와 동일한 연산을 제공
b[:-2].combine_first(a[2:])
# <출력>
# a NaN
# b 4.5
# c 3.0
# d 2.0
# e 1.0
# f 0.0
# dtype: float64
▷
combine_first 메서드는 컬럼에 대해 같은 동작을 한다.
호출하는 객체에서 누락된 데이터를 인자로 넘긴 객체에 있는 값으로 채워 넣을 수 있다.
df1 = pd.DataFrame({'a': [1., np.nan, 5., np.nan], 'b': [np.nan, 2., np.nan, 6.], 'c': range(2, 18, 4)})
df2 = pd.DataFrame({'a': [5., 4., np.nan, 3., 7.], 'b': [np.nan, 3., 4., 6., 8.]})
df1
# <출력>
# a b c
# 0 1.0 NaN 2
# 1 NaN 2.0 6
# 2 5.0 NaN 10
# 3 NaN 6.0 14
df2
# <출력>
# a b
# 0 5.0 NaN
# 1 4.0 3.0
# 2 NaN 4.0
# 3 3.0 6.0
# 4 7.0 8.0
▷
NaN 또는 empty 자리에 df2 데이터 채우기
df1.combine_first(df2)
# <출력>
# a b c
# 0 1.0 NaN 2.0
# 1 4.0 2.0 6.0
# 2 5.0 4.0 10.0
# 3 3.0 6.0 14.0
# 4 7.0 8.0 NaN
▷
# 계층적 색인은 DataFrame 의 데이터를 재배치하는 다음의 방식 제공
# 1. stack: 데이터의 컬럼을 로우로 피벗(회전)
# 2. unstack: 로우를 컬럼으로 피벗
▷
data = pd.DataFrame(np.arange(6).reshape((2, 3)),
index=pd.Index(['Ohio', 'Colorado'],
name='state'),
columns=pd.Index(['one', 'two', 'three'],
name='number'))
data
# <출력>
# number one two three
# state
# Ohio 0 1 2
# Colorado 3 4 5
result = data.stack()
result
# <출력>
# state number
# Ohio one 0
# two 1
# three 2
# Colorado one 3
# two 4
# three 5
# dtype: int32
▷
레벨 숫자나 이름을 전달해서 끄집어낼 단계 지정 가능
result.unstack(0)
# <출력>
# state Ohio Colorado
# number
# one 0 3
# two 1 4
# three 2 5
result.unstack(1)
# <출력>
# number one two three
# state
# Ohio 0 1 2
# Colorado 3 4 5
result.unstack('state')
# <출력>
# state Ohio Colorado
# number
# one 0 3
# two 1 4
# three 2 5
▷
unstack 하게 되면 누락된 데이터가 생길 수 있다.
s1 = pd.Series([0, 1, 2, 3], index=['a', 'b', 'c', 'd'])
s1
# <출력>
# a 0
# b 1
# c 2
# d 3
# dtype: int64
s2 = pd.Series([4, 5, 6], index=['c', 'd', 'e'])
s2
# <출력>
# c 4
# d 5
# e 6
# dtype: int64
data2 = pd.concat([s1, s2], keys=['one', 'two'])
data2
# <출력>
# one a 0
# b 1
# c 2
# d 3
# two c 4
# d 5
# e 6
# dtype: int64
data2.unstack()
# <출력>
# a b c d e
# one 0.0 1.0 2.0 3.0 NaN
# two NaN NaN 4.0 5.0 6.0
▷
stack 메서드는 누락된 데이터를 자동으로 걸려내기 때문에 연산을 쉽게 원상 복구할 수 있다.
data2.unstack()
# <출력>
# a b c d e
# one 0.0 1.0 2.0 3.0 NaN
# two NaN NaN 4.0 5.0 6.0
data2.unstack().stack()
# <출력>
# one a 0.0
# b 1.0
# c 2.0
# d 3.0
# two c 4.0
# d 5.0
# e 6.0
# dtype: float64
data2.unstack().stack(dropna=False)
# <출력>
# one a 0.0
# b 1.0
# c 2.0
# d 3.0
# e NaN
# two a NaN
# b NaN
# c 4.0
# d 5.0
# e 6.0
# dtype: float64
▷
DataFrame 을 unstack()할 때 unstack 레벨은 결과에서 가장 낮은 단계가 된다.
df = pd.DataFrame({'left': result, 'right': result + 5}, columns=pd.Index(['left', 'right'], name='side'))
df
# <출력>
# side left right
# state number
# Ohio one 0 5
# two 1 6
# three 2 7
# Colorado one 3 8
# two 4 9
# three 5 10
df.unstack('state')
# <출력>
# side left right
# state Ohio Colorado Ohio Colorado
# number
# one 0 3 5 8
# two 1 4 6 9
# three 2 5 7 10
▷
stack 을 호출할 때 쌓을 축의 이름을 지정할 수 있다.
df.unstack('state').stack('side')
# <출력>
# state Colorado Ohio
# number side
# one left 3 0
# right 8 5
# two left 4 1
# right 9 6
# three left 5 2
# right 10 7
반응형