我有以下数据框df,其中rank1是该行中的唯一排名,而rank2排名可以具有相同的值,例如在第0行中rank2_A和rank2_B的值相同。
rank1_A rank1_B rank1_C rank2_A rank2_B rank2_C
0 1 2 3 1 1 2
1 2 3 1 3 1 2
我想插入三个新列position_A,position_B,position_C,如果rank2最小,则这些列应显示为1,否则显示为0。如果rank2_A是rank2_A,rank2_B和rank2_C的最小值,则position_A将为1,position_B和position_C将为0。这很容易使用np.select
完成。 prefix = 'rank2'
for symbol in ['A', 'B', 'C']:
condition = [df[f'{prefix}_{symbol}'] == df[['rank2_A', 'rank2_B', 'rank2_C']].min(axis=1)]
df[f'position_{symbol}'] = np.select(condition, [1], default=0)
通过应用以上内容,我得到了以下信息:
rank1_A rank1_B rank1_C rank2_A rank2_B rank2_C position_A position_B position_C
0 1 2 3 1 1 2 1 1 0
1 2 3 1 3 1 2 0 1 0
这里的问题是,只有一个位置列应显示为1,其余所有列应显示为0。对于第一行,由于rank2_A和rank2_B相同,因此不会发生这种情况。有没有一种方法可以将基于rank2的位置列放在首位,如果它们是唯一的,如果它们不是唯一的,则对rank1列应用np.select,以得到以下所需结果:
rank1_A rank1_B rank1_C rank2_A rank2_B rank2_C position_A position_B position_C
0 1 2 3 1 1 2 1 0 0
1 2 3 1 3 1 2 0 1 0