Вписать строку в заданный шаблон?

У меня есть столбец данных, который выглядит так:

A002
A0011
A0001
A0001A
A2
A3A
A02

и нужно вписать его в формат A00XXY то есть:

A0002
A0011
A0001
A0001A
A0002
A0003A
A0002

в настоящее время у меня есть

df.col.str.lstrip('A0')
for x in df.col.str.contains(r'[0-9]\w{1}$'):
    if x:
        df.col = 'A000' + df.col
    else:
        df.col = 'A00' + df.col

Но это становится рекурсивным? Каким будет лучший способ сделать это?

Вывод не весь в формате A00XXY ?

Erfan 27.05.2019 17:51

Извините, форматирование от 1 до 01, поэтому X до A000X, если X в единственном числе, и XX до A00XX и так далее.

Roy Han 27.05.2019 17:55
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
37
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

df['Start_letter'] = df['Col'].str.extract('(^[A-Za-z])').fillna('')              # Extract the first letter
df['End_letter'] = df['Col'].str.extract('([A-Za-z]$)').fillna('')                # Extract the last letter
df['Nums'] = df['Col'].str.replace('[A-Za-z]', '').apply(lambda x: x.zfill(4))    # Extract the numbers between the letters
df['Col'] = df['Start_letter'] + df['Nums'] + df['End_letter']

df = df.iloc[:, :1]

      Col
0   A0002
1   A0011
2   A0001
3  A0001A
4   A0002
5  A0003A
6   A0002

Если у вас есть свинцовые панды 0.20, Series.str.replace может использовать объект соответствия через вызываемый объект. Итак, вы можете сделать:

df['col'] = df.col.str.replace(r'A([0-9]{0,4})(\S*)',
                               lambda m: "A00{:02d}{}".format(int(m.group(1)), m.group(2)))

Если у вас более старая версия pandas, вы можете заменить значения:

df['col'] = ["A00{:02d}{}".format(int(m.group(1)), m.group(2))
             for m in [re.match(r'A([0-9]{0,4})(\S*)', k) for k in df.col]]

Другие вопросы по теме