У меня есть столбец данных, который выглядит так:
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
Но это становится рекурсивным? Каким будет лучший способ сделать это?
Извините, форматирование от 1 до 01, поэтому X до A000X, если X в единственном числе, и XX до A00XX и так далее.
Чтобы полностью обобщить это, чтобы оно работало во всех случаях, я предприму несколько дополнительных шагов и 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]]
Вывод не весь в формате
A00XXY
?