Подсчитайте количество определенных значений в нескольких столбцах pandas

#python #pandas #dataframe

#питон #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных:

 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)
 

Обратите внимание, что ПОКУПКА может отображаться только в столбцах B, C, D, E.

Я попытался найти решение в Интернете, но, к моему удивлению, ничего не нашел.

Небольшая помощь будет оценена по достоинству. Спасибо!

Ответ №1:

Вы можете сравнить, а затем суммировать:

 df['score'] = (df[['B','C','D','E']] == 'BUY').sum(axis=1)
 

Это суммирует все логические значения, и вы получаете правильный результат.


Когда вы это делаете df[df == 'BUY'] , вы просто заменяете все, чего нет BUY , np.nan а затем берете сумму по оси =1. не работает, поскольку все, что у вас осталось в результате np.nan , 'BUY' — это строка. Следовательно, вы получаете все 0.

Ответ №2:

Или вы могли бы использовать apply с list.count :

 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
 

Ответ №3:

Попробуйте использовать apply с lambda over axis=1 . Это позволяет собирать каждую строку за раз в виде серии. Вы можете использовать условие [row == 'BUY'] для фильтрации строки, а затем подсчитать количество «ПОКУПОК», используя len()

 df['score'] = df.apply(lambda row: len(row[row == '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
 

Ответ №4:

 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