I use pd.get_dummies
, mask
andmul
n = {True: 'main_val', False: 'sub_val'}
m = pd.get_dummies(df.value > 0).rename(columns=n)
df.drop('value', 1).join(m.mask(m == 0).mul(df.value, 0))
col1 col2 time sub_val main_val
0 A sdf 16:00:00 NaN 100.0
1 B sdh 17:00:00 -40.0 NaN
2 A sf 18:00:45 NaN 300.0
3 D sfd 20:04:33 -89.0 NaN
If you look m.mask(m == 0)
, it becomes clearer how it works.
sub_val main_val
0 NaN 1.0
1 1.0 NaN
2 NaN 1.0
3 1.0 NaN
pd.get_dummies
. np.nan
. mul
, df.value
, . join
, .
numpy
v = df.value.values[:, None]
m = v > 0
n = np.where(np.hstack([m, ~m]), v, np.nan)
c = ['main_val', 'sub_val']
df.drop('value', 1).join(pd.DataFrame(n, df.index, c))
sub_val main_val
0 NaN 1.0
1 1.0 NaN
2 NaN 1.0
3 1.0 NaN