如何在python数据框中的多列之间执行“或”操作?

时间:2019-12-10 10:02:10

标签: python pandas dataframe

我的df:

No  A   B   C  D
1   1   1   0  1
2   1   1   1  0
3   1   0   1  1
4   1   1   1  1

我想执行A或B或C或D并将结果写入列中。

No  A   B   C  D Result
1   1   1   0  1 1
2   1   1   1  0 1
3   1   0   1  1 1
4   1   1   1  1 1
...

所以想法是,即使A,B,C或D中存在一个“ 1”,结果也为“ 1”。

4 个答案:

答案 0 :(得分:4)

一个想法是使用DataFrame.any每行至少测试一个1或每行使用max

#if No is column
df['Result'] = df.iloc[:, 1:].any(axis=1).astype(int)
#if No is index
#df['Result'] = df.any(axis=1).astype(int)

如果还有其他列:

df['Result'] = df[['A','B','C','D']].any(axis=1).astype(int)

或者:

df['Result'] = df[['A','B','C','D']].max(axis=1)


print (df)

   No  A  B  C  D  Result
0   1  1  1  0  1       1
1   2  1  1  1  0       1
2   3  1  0  1  1       1
3   4  1  1  1  1       1

答案 1 :(得分:1)

尝试使用:

df['Result'] = df.drop('No', axis=1).max(1)
print(df)

输出:

   No  A  B  C  D  Result
0   1  1  1  0  1       1
1   2  1  1  1  0       1
2   3  1  0  1  1       1
3   4  1  1  1  1       1

答案 2 :(得分:1)

要添加到有趣的方式列表中:

df_a['Result'] = df_a.eval('A + B + C').astype(bool)

优点是eval不会在内存中创建中间表。 如果您需要显式的 int 而不是 bool ,则可以进行强制转换,

df_a['Result'] = df_a.eval('A + B + C').astype(bool).astype(int)

答案 3 :(得分:1)

奇怪的是,没有人提到使用简单的|运算符。

回答您的问题

df['Result'] = df['A'] | df['B'] | df['C'] | df['D']

类似地,如果您要执行其他操作,例如AND

df['Result'] = df['A'] & df['B'] & df['C'] & df['D']