这是我的数据集,称它们为df
Id Name Math Physics Biology Chemistry
1 Andy A B A B
2 Bert Other C Other A
3 Candy Other Other A B
4 Dony B A C B
期望值不包括'Other'
,第一个期望值称为'Grade'
:
Id Name Math Physics Biology Chemistry Grade
1 Andy A B A B A
2 Bert Other C Other A C
3 Candy Other Other A B A
4 Dony B A C B B
答案 0 :(得分:2)
mask
+ bfill
您可以通过布尔数据框进行遮罩,然后回填并获取第一列:
df['Grade'] = df.iloc[:, 2:].mask(df.iloc[:, 2:].eq('Other')).bfill(1).iloc[:, 0]
答案 1 :(得分:1)
这是使用justify
的解决方案:
df['Grade'] = justify(df.iloc[:,2:].values, invalid_val='Other')[:,0]
Id Name Math Physics Biology Chemistry Grade
0 1 Andy A B A B A
1 2 Bert Other C Other A C
2 3 Candy Other Other A B A
3 4 Dony B A C B B
答案 2 :(得分:1)
df['Grade'] = df.lookup(df.index, (df.iloc[:, 2:] != 'Other').idxmax(axis=1))
print(df)
输出
Id Name Math Physics Biology Chemistry Grade
0 1 Andy A B A B A
1 2 Bert Other C Other A C
2 3 Candy Other Other A B A
3 4 Dony B A C B B
使用idxmax
,您将为每一行获得与Other
不同的第一列索引。然后使用lookup
获取每个单元格的值。
答案 3 :(得分:1)
将'Other'
替换为np.nan
>>df.replace('Other',np.nan,inplace=True)
然后:
>>df['Grade']=df.iloc[:,2:].bfill(axis=1).iloc[:,0]
将Other
代替np.nan
>>df.replace(np.nan,'Other',inplace=True)