【问题标题】:Compare multiple row values比较多行值
【发布时间】:2017-03-07 08:34:22
【问题描述】:
我想将每一行的 A 值与其他列进行比较
问题更复杂,但我试图在此表中简化它:
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
提前谢谢你
【问题讨论】:
标签:
python
python-3.x
pandas
dataframe
【解决方案1】:
使用assign 创建新列
使用 df.le(df.A, 0) 将列 'A' 与所有其他列进行比较
使用all(1) 查找所有列的True 位置
使用astype(int) 使其成为1 或0
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】:
您可以使用gt 或le 进行比较,然后使用any 或all 获得至少一个True 或all Trues,最后将布尔掩码转换为int:
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
【解决方案3】:
你可以使用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
【解决方案4】:
如果您知道列名,请执行以下操作:
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。