将琴弦装配成预定图案?

时间:2019-05-27 15:41:44

标签: python pandas

我有一个数据框列,如下所示:

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

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

2 个答案:

答案 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]]