我有一个数据框列,如下所示:
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
但这会递归吗?最好的方法是什么?
答案 0 :(得分:1)
要完全概括这一点,以便在所有情况下都可以使用,我将采取一些额外的步骤,并使用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
答案 1 :(得分:1)
如果大熊猫的铅含量为0.20,Series.str.replace
可以通过可调用对象使用match对象。因此,您可以这样做:
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)))
如果您使用的是较早版本的熊猫,则可以替换以下值:
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]]