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,其中如果class = A,它将使得除了score1之外的其他列0,如果class = B,则除了得分2之外将使其他0为0并且如果class = C,则除了得分3之外将使其他0为0 :
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
.. .. .. ..
答案 0 :(得分:2)
您可以将broadcasting
用于比较列Class
和列,这些列由dict
映射。然后通过True
按get_loc
按位置设置class
来屏蔽列df
,然后按numpy.where
与DataFrame
构造函数创建新的#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
,从而更改模板:
load