我用pd.get_dummies
,mask
和mul
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
如果你看看m.mask(m == 0)
,它會變得更清楚它是如何工作的。
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
@MaxU - 謝謝你。 – jezrael