Как преобразовать в столбе, в каждой строке, последний символ в нижний регистр?
Как столбце COL в каждой строке преобразовать последний символ в нижний регистр?
Исходный файл
Результат
Смог только понять, как в строке преобразовать последний символ в нижний регистр. А как в Pandas.Dataframe нет.
str_original = '999A'
str_end = str_original.replace(str_original[-1], str_original[-1].lower())
print(str_original)
999a
Ответы (2 шт):
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"]]
Как вариант можно через 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 конечно будет гораздо эффективнее.

