У меня есть следующая функция, которая работает, но на самом деле ничего не делает с моим фреймом данных. Есть идеи, почему это не работает?

Технология - это столбец со значениями, такими как AT&T, HP, NaN, SAP, GORDON и т. Д. Я пытаюсь применить функцию для применения функции Title к каждой строке (например, GORDON -> Gordon), но игнорирую те строки с присутствующими аббревиатурами ( например, AT&T, а не At & t, или HP вместо Hp). Мне также нужно избегать случаев, когда аббревиатура встречается в более крупном слове (например, Sapori Trattoria, а не SAPori Trattoria)

data = [['HP', 10], ['GORDON', 15], ['AT&T', 14], [NaN, 9]]
db = pd.DataFrame(data, columns = ['Technology', 'Age'])

acronyms = {'HP', 'GE', 'TBD', 'AT&T'}

def title_case_not_acronyms(orig_str):
    words = orig_str.split(" ")
    words_tc = [word if word in acronyms else word.title() for word in words]
    return " ".join(words)

db['Technology'] = db['Technology'].astype(str).apply(title_case_not_acronyms)
0
RCarmody 15 Окт 2021 в 18:56

2 ответа

Лучший ответ

По сути, ваша функция возвращает ту же строку, которая была ей передана.

Вам нужно вернуть " ".join(words_tc), а не " ".join(words).

def title_case_not_acronyms(orig_str):
    words = orig_str.split(" ")
    words_tc = [word if word in acronyms else word.title() for word in words]
    return " ".join(words_tc)
0
norie 15 Окт 2021 в 16:20

Вы также можете использовать:

df['Technology'] = df['Technology'].str.split(' ', expand=True).apply(lambda x: ' '.join([a if a in acronyms else a.title() for a in x.dropna()]), axis=1)
0
Muhammad Hassan 15 Окт 2021 в 16:25