跨列范围使用np.where

2024-06-08 12:21:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用np.where根据其他三列中的条件创建一个新列。在下面的df中,我想创建一个新的“score”列,对于B、C、D列中的每一个小于等于5的数字,该列的值加1

df = pd.DataFrame({'A':[1,2,3], 'B':[5,7,9], 'C':[2,6,4], 'D':[6,7,8]})
df

    A   B   C   D
0   1   5   2   6
1   2   7   6   7
2   3   9   4   8

预期结果如下所示:

    A   B   C   D   score
0   1   5   2   6     2
1   2   7   6   7     0
2   3   9   4   8     1

我可以分别为每列B、C、D写一个np.where条件,但不知道如何将它们累加起来;而且,真正的数据有数百列要查询,而不是只有3列,因此手工查询似乎很愚蠢,我相信有一种更好的方法我没有想到


Tags: 数据方法dataframedfnp数字where条件
2条回答

^{}与列colssum的列表一起用于计数True

cols = ['B','C','D']
df['score'] = df.le(5).sum(axis=1)
print (df)
   A  B  C  D  score
0  1  5  2  6      2
1  2  7  6  7      0
2  3  9  4  8      1

如果需要所有不带第一列的列:

df['score'] = df.iloc[:, 1:].le(5).sum(axis=1)

如果需要不带A列的所有列:

df['score'] = df.drop('A', axis=1).le(5).sum(axis=1)

编辑:OP更改问题后。获取列表C中提到的所有列中少于5个元素的计数(在列表C中也可以提到更多元素,根据所示示例,现在它有B,C,D

c = ['B','C','D']
df['score'] = df[df[c].le(5)].count(1)

df将如下所示:

    A   B   C   D   score
0   1   5   2   6   2
1   2   7   6   7   0
2   3   9   4   8   1


使用布尔掩蔽,您可以尝试以下操作

m = df.le(5)
df['score'] = df[m].count(axis=1)

样本df的输出如下所示:

    A   B   C   D   score
0   1   5   2   6   3
1   2   7   6   7   1
2   3   9   4   8   2

相关问题 更多 >