2017-09-19 28 views
1
stats_all_score.head() 

class score1 score2 score3 
A  1.67 3.60 5.50 
A  3.60 3.25 2.10 
A  2.25 3.25 3.25 
B  1.17 6.50 21.00 
C  3.20 3.25 2.30 
..  ..  ..  .. 

我怎樣才能使stats_all_score這樣的,其中,如果類= A就會使其他列0除了score1,如果類= B,會讓別人0除了比分2和如果類= C,會讓別人0除了score3:行列的if-else使用熊貓

class score1 score2 score3 
A  1.67 0  0 
A  3.60 0  0 
A  2.25 0  0 
B  0  6.50 0 
C  0  0  2.30 
..  ..  ..  .. 

回答

2

可以使用broadcasting與列,這是由dict映射比較柱Class。然後通過設置True s到面具class列由get_loc按位置由numpy.whereDataFrame構造改變面具和持續創造新的df

#dynamically create dict, thanks Bharath shetty 
d = dict(zip(df.columns[1:],df.set_index('class').index.unique())) 
#same as 
#d = {'score1':'A','score2':'B','score3':'C'} 

m = df['class'].values[:, None] == df.columns.to_series().map(d).values 
m[:, df.columns.get_loc('class')] = True 
#same as set first column to 0 
#m[:, 0] = True 
print (m) 
[[ True True False False] 
[ True True False False] 
[ True True False False] 
[ True False True False] 
[ True False False True]] 

df = pd.DataFrame(np.where(m, df.values, 0), index = df.index, columns=df.columns) 
print (df) 
    class score1 score2 score3 
0  A 1.67  0  0 
1  A 3.6  0  0 
2  A 2.25  0  0 
3  B  0 6.5  0 
4  C  0  0 2.3 
+0

如果我的數據是大約2000+行:( –

+0

我認爲它應該是 – jezrael

+1

@Bharathshetty - 是的,這是另一種可能的解決方案 – jezrael