使用pandas的row-column if-else

时间:2017-09-19 10:41:04

标签: python-3.x pandas

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
..      ..      ..      ..

1 个答案:

答案 0 :(得分:2)

您可以将broadcasting用于比较列Class和列,这些列由dict映射。然后通过Trueget_loc按位置设置class来屏蔽列df,然后按numpy.whereDataFrame构造函数创建新的#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