Преобразовать определенные части строки в верхний регистр? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть DataFrame, и я хотел бы сделать только определенные части строк, которые должны быть заглавными, с подчеркиванием после слов.

|         TYPE       |  NAME  |
|-----------------------------|
| Contract Employee  | John   |
| Full Time Employee | Carol  |
| Temporary Employee | Kyle   |

Мне бы хотелось, чтобы слова "Контракт" и "Временный" были заглавными, как это, с подчеркиванием после и перед словом:

|         TYPE         |  NAME  |
|-------------------------------|
| _CONTRACT_ Employee  | John   |
| Full Time Employee   | Carol  |
| _TEMPORARY_ Employee | Kyle   |

Я пытался использовать str.upper (), но это делало верхний регистр всей ячейки, и я искал только эти определенные слова.

РЕДАКТИРОВАТЬ: я должен упомянуть, иногда слова не пишутся с большой буквы, если это имеет значение Часто он будет отображаться как temporary employee вместо Temporary Employee.

Ответы [ 5 ]

0 голосов
/ 12 ноября 2018

Это простой и легкий способ, используя replace с форматом словаря.

Пожалуйста, обратитесь к документу Pandas для Series.replace

df["TYPE"] = df["TYPE"].replace({'Contract': '_CONTRACT_', 'Temporary': '_Temporary_'}, regex=True)

Только что воспроизведено:

>>> df
                 TYPE   Name
0   Contract Employee   John
1  Full Time Employee  Carol
2  Temporary Employee   Kyle

>>> df["TYPE"] = df["TYPE"].replace({'Contract': '_CONTRACT_', 'Temporary': '_TEMPORARY_'}, regex=True)
>>> df
                   TYPE   Name
0   _CONTRACT_ Employee   John
1    Full Time Employee  Carol
2  _TEMPORARY_ Employee   Kyle
0 голосов
/ 12 ноября 2018

Отвечая на часть моего собственного вопроса здесь. Используя приведенное им регулярное выражение @Tim Biegeleisen, я заменил строку в столбце.

df["TYPE"] = df["TYPE"].str.replace(r'\b(Contract)\b', '_CONTRACT_')
0 голосов
/ 12 ноября 2018

Что-то, что изменяет фрейм данных (без регулярных выражений или чего-либо еще):

l=['Contract','Temporary']
df['TYPE']=df['TYPE'].apply(lambda x: ' '.join(['_'+i.upper()+'_' if i in l else i for i in x.split()]))

join и split, находящиеся в apply.

А потом сейчас:

print(df)

Является:

                   TYPE   NAME
0   _CONTRACT_ Employee   John
1    Full Time Employee  Carol
2  _TEMPORARY_ Employee   Kyle
0 голосов
/ 12 ноября 2018

U9 побил меня, используя lambda и split() на входе:

def match_and_upper(match):
    matches = ["Contract", "Temporary"]
    if match in matches:
        return match.upper()
    return match

input = "Contract Employee"
output = " ".join(map(lambda x: match_and_upper(x), input.split()))
# Result: CONTRACT Employee # 
0 голосов
/ 12 ноября 2018

Вот один вариант использования re.sub:

def type_to_upper(match):
    return match.group(1).upper()

text = "Contract Employee"
output = re.sub(r'\b(Contract|Temporary)\b', type_to_upper, text)

EDIT:

Это тот же подход, который применяется в пандах, также учитывающий последние изменения в отношении неопределенных прописных или строчных букв, которые должны быть заменены:

тестовый фрейм данных:

                 TYPE   NAME
0   Contract Employee   John
1  Full Time Employee  Carol
2  Temporary Employee   Kyle
3   contract employee   John
4  Full Time employee  Carol
5  temporary employee   Kyle

Решение:

def type_to_upper(match):
    return '_{}_'.format(match.group(1).upper())

df.TYPE = df.TYPE.str.replace(r'\b([Cc]ontract|[Tt]emporary)\b', type_to_upper)

результат:

df 
                   TYPE   NAME
0   _CONTRACT_ Employee   John
1    Full Time Employee  Carol
2  _TEMPORARY_ Employee   Kyle
3   _CONTRACT_ employee   John
4    Full Time employee  Carol
5  _TEMPORARY_ employee   Kyle

Обратите внимание, что это только для решения именно этих двух случаев, которые определены в запросе OP. Для полной нечувствительности к регистру это еще проще:

df.TYPE = df.TYPE.str.replace(r'\b(contract|temporary)\b', type_to_upper, case=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...