把一根绳子装进预定的图案?

2024-09-27 20:16:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe列,看起来像:

A002
A0011
A0001
A0001A
A2
A3A
A02

需要将其调整为A00XXY格式 i、 电子邮件:

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

但这是递归的吗?最好的方法是什么


Tags: a2dataframedf电子邮件格式colstra02
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]]

相关问题 更多 >

    热门问题