Python 计算多列中特定值的数量

Python 计算多列中特定值的数量,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框: A B C D E 12 4.5 6.1 BUY NaN 12 BUY BUY 5.6 NaN BUY 4.5 6.1 BUY NaN 12 4.5 6.1 0 NaN 我想计算每行中出现“买入”的次数。预期结果: A B C D E score 12 4.5 6.1 BUY NaN 1 12 BUY BUY 5.6 NaN 2 15 4.

我有一个数据框:

A    B    C    D     E

12  4.5  6.1   BUY  NaN
12  BUY  BUY   5.6  NaN
BUY  4.5  6.1  BUY  NaN
12  4.5  6.1   0    NaN 
我想计算每行中出现“买入”的次数。预期结果:

A    B    C    D     E   score

12  4.5  6.1   BUY  NaN    1
12  BUY  BUY   5.6  NaN    2
15  4.5  6.1  BUY   NaN    1
12  4.5  6.1   0    NaN    0
我尝试了以下方法,但对所有行只给出0:

df['score'] = df[df == 'BUY'].sum(axis=1)
请注意,BUY只能出现在B、C、D、E列中

我试图在网上找到解决办法,但令人震惊的是,一个也没有找到


很少的帮助将被感激。谢谢

尝试在轴=1上使用
apply
lambda
。这将一次拾取每一行作为一个系列。您可以使用条件
[row=='BUY']
筛选行,然后使用
len()计算'BUY'的数量。


尝试将
apply
lambda
一起在轴=1上使用。这将一次拾取每一行作为一个系列。您可以使用条件
[row=='BUY']
筛选行,然后使用
len()计算'BUY'的数量。


或者您可以将
应用
列表一起使用。计数

df['score'] = df.apply(lambda x: x.tolist().count('BUY'), axis=1)
print(df)
输出:

     A    B    C    D   E  score
0   12  4.5  6.1  BUY NaN      1
1   12  BUY  BUY  5.6 NaN      2
2  BUY  4.5  6.1  BUY NaN      2
3   12  4.5  6.1    0 NaN      0
      A   B   C   D   E score
0    12 4.5 6.1 BUY NaN     1
1    12 BUY BUY 5.6 NaN     2
2   BUY 4.5 6.1 BUY NaN     2
3    12 4.5 6.1   0 NaN     0

或者您可以将
应用
列表一起使用。计数

df['score'] = df.apply(lambda x: x.tolist().count('BUY'), axis=1)
print(df)
输出:

     A    B    C    D   E  score
0   12  4.5  6.1  BUY NaN      1
1   12  BUY  BUY  5.6 NaN      2
2  BUY  4.5  6.1  BUY NaN      2
3   12  4.5  6.1    0 NaN      0
      A   B   C   D   E score
0    12 4.5 6.1 BUY NaN     1
1    12 BUY BUY 5.6 NaN     2
2   BUY 4.5 6.1 BUY NaN     2
3    12 4.5 6.1   0 NaN     0

您可以比较,然后求和:

df['score'] = (df[['B','C','D','E']] == 'BUY').sum(axis=1)
这将所有布尔值相加,得到正确的结果



当您执行
df[df=='BUY']
时,您只是用
np.nan
替换任何不属于
BUY
的内容,然后将axis=1的和取下来就行不通了,因为您在结果中只剩下
np.nan
'BUY'
字符串。因此,您得到所有0。

您可以比较,然后求和:

df['score'] = (df[['B','C','D','E']] == 'BUY').sum(axis=1)
import numpy as np
df['score'] = np.count_nonzero(df == 'BUY', axis=1)
这将所有布尔值相加,得到正确的结果


当您执行
df[df=='BUY']
时,您只是用
np.nan
替换任何不属于
BUY
的内容,然后将axis=1的和取下来就行不通了,因为您在结果中只剩下
np.nan
'BUY'
字符串。因此你得到了所有的0

import numpy as np
df['score'] = np.count_nonzero(df == 'BUY', axis=1)
输出:

     A    B    C    D   E  score
0   12  4.5  6.1  BUY NaN      1
1   12  BUY  BUY  5.6 NaN      2
2  BUY  4.5  6.1  BUY NaN      2
3   12  4.5  6.1    0 NaN      0
      A   B   C   D   E score
0    12 4.5 6.1 BUY NaN     1
1    12 BUY BUY 5.6 NaN     2
2   BUY 4.5 6.1 BUY NaN     2
3    12 4.5 6.1   0 NaN     0
输出:

     A    B    C    D   E  score
0   12  4.5  6.1  BUY NaN      1
1   12  BUY  BUY  5.6 NaN      2
2  BUY  4.5  6.1  BUY NaN      2
3   12  4.5  6.1    0 NaN      0
      A   B   C   D   E score
0    12 4.5 6.1 BUY NaN     1
1    12 BUY BUY 5.6 NaN     2
2   BUY 4.5 6.1 BUY NaN     2
3    12 4.5 6.1   0 NaN     0