Как преобразовать в столбе, в каждой строке, последний символ в нижний регистр?

Как столбце COL в каждой строке преобразовать последний символ в нижний регистр?

Исходный файл

введите сюда описание изображения

Результат

введите сюда описание изображения

Смог только понять, как в строке преобразовать последний символ в нижний регистр. А как в Pandas.Dataframe нет.

str_original = '999A'
    
str_end = str_original.replace(str_original[-1], str_original[-1].lower())

print(str_original)

999a

Ответы (2 шт):

Автор решения: MaxU
In [38]: df = pd.DataFrame({"col":["ONE","TWO","THREE"]})

In [39]: df["col"] = df["col"].str[:-1] + df["col"].str[-1].str.lower()

In [40]: df
Out[40]:
     col
0    ONe
1    TWo
2  THREe

PS вас уже неоднократно просили указывать примеры данных в вопросе в воспроизводимом виде - (в виде текста / CSV / Python кода или ссылки на файл). Прочтите, все-таки, почему это важно... ;)


Сравнение скорости выполнения для DataFrame'а, состоящего из 30.000 строк:

In [44]: big = pd.concat([df] * 10000, ignore_index=True)

In [45]: big.shape
Out[45]: (30000, 1)

In [49]: %timeit big["res"] = [s[:-1] + s[-1].lower() for s in big["col"]]
9.19 ms ± 95.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [50]: %timeit big['res'] = big['col'].apply(lambda x: x[:-1] + x[-1].lower())
9.41 ms ± 97.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [51]: %timeit big["res"] = big["col"].str[:-1] + big["col"].str[-1].str.lower()
26.9 ms ± 753 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Сравнение скорости выполнения для DataFrame'а, состоящего из 300.000 строк:

In [52]: big = pd.concat([df] * 100000, ignore_index=True)

In [53]: big.shape
Out[53]: (300000, 1)

In [54]: %timeit big["res"] = big["col"].str[:-1] + big["col"].str[-1].str.lower()
272 ms ± 7.76 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [55]: %timeit big['res'] = big['col'].apply(lambda x: x[:-1] + x[-1].lower())
106 ms ± 3.72 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [56]: %timeit big["res"] = [s[:-1] + s[-1].lower() for s in big["col"]]
99.5 ms ± 1.24 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Вывод:

Самым быстрым оказался вариант с list comprehension:

df["col"] = [s[:-1] + s[-1].lower() for s in df["col"]]
→ Ссылка
Автор решения: CrazyElf

Как вариант можно через apply и lambda тоже самое по сути решение, так мне кажется менее громоздко смотрится, чем многократное повторение df['col'].str:

import pandas as pd

df = pd.DataFrame({"col":["ONE","TWO","THREE"]})
df['col'] = df['col'].apply(lambda x: x[:-1] + x[-1].lower())
df

Хотя если данных очень много, то векторное решение через .str конечно будет гораздо эффективнее.

→ Ссылка