2017-04-13 17 views
6

Bir ölçütü temel alarak bir sütunu iki farklı sütuna nasıl ayırırsınız, ancak bir anahtarı mı korursunuz? ÖrneğinPozitif ve Negatif değerlerde bir Sütun Bölme

 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 

için bu

 time  main_val sub_val 
0 16:00:00  100   NaN 
1 17:00:00  NaN   -40 
2 18:00:45  300   NaN 
3 20:04:33  NaN   -89 

cevap

6

gibi yeni bir dataframe kullanabilirsiniz istiyorum mask: Kullandığım

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 
+0

@MaxU yapılabilir hızını artırabilir - teşekkür ederim. – jezrael

4

pd.get_dummies, mask ve 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)'a bakarsanız, bunun nasıl çalıştığı daha net olur.

sub_val main_val 
0  NaN  1.0 
1  1.0  NaN 
2  NaN  1.0 
3  1.0  NaN 

pd.get_dummies

sıfırları ve olanları bize verir. Sonra tüm sıfırları np.nan'a yaparım. mul ile çarptığımda, df.value sütunu her iki sütunda da yayınlanır ve sonuçlarımız vardır. Veritabanına eklemek için join kullanıyorum.


Biz 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 
1

Bu bile Pivot Tablo

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'] 
İlgili konular