按正值和负值拆分列

2024-04-29 16:11:46 发布

您现在位置:Python中文网/ 问答频道 /正文

如何根据一个条件将一个列拆分为两个不同的列,但保留一个键?例如

      col1  col2   time       value
0      A     sdf  16:00:00     100
1      B     sdh  17:00:00     -40
2      A     sf   18:00:45     300 
3      D     sfd  20:04:33     -89

我想要一个像这样的新数据帧

^{pr2}$

Tags: 数据timevaluesf条件col2col1sdh
3条回答

您可以使用^{}

mask = df['value'] < 0
df['main_val'] = df['value'].mask(mask)
df['sub_val'] = df['value'].mask(~mask)
df = df.drop(['col1','col2', 'value'], axis=1)
print (df)
       time  main_val  sub_val
0  16:00:00     100.0      NaN
1  17:00:00       NaN    -40.0
2  18:00:45     300.0      NaN
3  20:04:33       NaN    -89.0

我使用pd.get_dummiesmask,和{}

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),它是如何工作的就更加清楚了。在

^{pr2}$

pd.get_dummies给出了0和1。然后我把所有的零变成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

这甚至可以通过透视表来完成

df['Val1'] = np.where(df.value >=0,'main_val','sub_val' )

df = pd.pivot_table(df,index='time', values='value',
                columns=['Val1'], aggfunc=np.sum).reset_index()

df = pd.DataFrame(df.values)
df.columns = ['time','main_val','sub_val']

相关问题 更多 >