2017-03-07 111 views
1

我想比较的每一行,与其他列比较多行值

的问题是比较复杂的,但我试图把它简化此表中的值:

 A B C D 
0 1.3 1.0 1.1 1 
1 2.5 2.9 2.6 3 
2 3.1 3.0 3.2 2 

结果应该是这样的:

在这里,在索引0:1.3比B,C和d的值越大,则我们返回1,否则是0

 A B C D result 
0 1.3 1.0 1.1 1  1 
1 2.5 2.9 2.6 3  0 
2 3.1 3.0 3.2 2  0 

预先感谢您

回答

4

使用assign创建新列
使用df.le(df.A, 0)'A'比较所有其它列
使用all(1)找到所有列在那里True
使用astype(int)使其10

df.assign(result=df.lt(df.A, 0).all(1).astype(int)) 

    A B C D result 
0 1.3 1.0 1.1 1  1 
1 2.5 2.9 2.6 3  0 
2 3.1 3.0 3.2 2  0 
2

您可以使用gtle对相比,则获得至少一个Trueall Trues和最后投布尔面膜intanyall

df['result'] = (~df[['B','C','D']].gt(df.A, axis=0).any(1)).astype(int) 
print (df) 
    A B C D result 
0 1.3 1.0 1.1 1  1 
1 2.5 2.9 2.6 3  0 
2 3.1 3.0 3.2 2  0 

另一种解决方案:

df['result'] = df[['B','C','D']].le(df.A, axis=0).all(1).astype(int) 
print (df) 
    A B C D result 
0 1.3 1.0 1.1 1  1 
1 2.5 2.9 2.6 3  0 
2 3.1 3.0 3.2 2  0 
1

您可以使用idxmax

df['result'] = (df.idxmax(axis=1)== 'A').astype(int) 

输出:

A B C D result 
0 1.3 1.0 1.1 1  1 
1 2.5 2.9 2.6 3  0 
2 3.1 3.0 3.2 2  0 
0

,如果你知道列名称:

df['results']=(df.loc[:,'A']>df.loc[:,'B':'D'].max(axis=1)).astype(int) 

,如果你知道想要的工作与列命令你可以这样做:在你的榜样

df['results']=(df.iloc[:,0]>df.iloc[:,1:].max(axis=1)).astype(int) 

那些会给出相同的输出。 最后的“astype(int)”将布尔值转换为0/1。