#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