Мне нужно было бы подсчитать строки, начинающиеся со слова в верхнем регистре (например, STACKOVERFLOW) по классам. Чтобы найти слово в верхнем регистре, я использую следующую строку кода:
df['UP'] = df['TEST'].str.findall(r'\b([A-Z]{2,})')
Я думаю, что я должен рассмотреть что-то вроде этого [1] (первое слово).
Мой набор данных выглядит так:
TEST Class
HELLOOOOO!!! 1
What are you doing? 0 # since this is only a capital letter, this should not be counted
Say nothing! 1 # since this is only a capital letter, this should not be counted
How are you? 0 # since this is only a capital letter, this should not be counted
HI man 1
Давайте попробуем извлечь первые две заглавные буквы, найти, где нет возвращенного NaN, и преобразовать его в целое число.
df['Class']=df.TEST.str.extract('(^[A-Z]{2})').notna().astype(int)
Ваш шаблон регулярного выражения потерпит неудачу, если у вас есть слово с двумя заглавными буквами, а остальные строчные. Это может помочь.
import pandas as pd
df = pd.DataFrame({'TEST': {0: 'HELLOOOOO!!!',
1: 'WHat are you doing?',
2: 'Say nothing!',
3: 'How are you?',
4: 'HI man'},
'Class': {0: 1, 1: 0, 2: 1, 3: 0, 4: 1}})
df['Upper'] = df['TEST'].apply(lambda x: x.split()[0].isupper())
df.groupby('Class')['Upper'].sum()
Выход
Class
0 0
1 2
Просто удалите часть .isupper()
. он уже смотрит только на первое слово в строке. Это, конечно, нарушит окончательный расчет.
Большое спасибо, Крис. Если бы я хотел иметь вместо True/False слово, которое выше, могу ли я использовать df['Upper'] = df['TEST'].str.findall(r'\b([A-Z]{2,} )')? Я думаю, мне следует добавить что-то, что выбирает в этот момент только первое слово в строке (как вы упомянули в своем ответе)