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
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
您可以使用^{} :
我使用}
pd.get_dummies
,mask
,和{如果你看一下
^{pr2}$m.mask(m == 0)
,它是如何工作的就更加清楚了。在pd.get_dummies
给出了0和1。然后我把所有的零变成np.nan
。当我与mul
相乘时,df.value
列在这两列中被广播,我们得到了结果。我使用join
将其附加回数据帧。在我们可以用
numpy
来提高速度这甚至可以通过透视表来完成
相关问题 更多 >
编程相关推荐