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

 

 

반응형