如何在多列标签上获得第一个非其他标签

时间:2019-01-08 11:13:56

标签: python pandas dataframe

这是我的数据集,称它们为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

4 个答案:

答案 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)

使用idxmax + lookup

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)