Заменить значения в столбце фрейма данных (регулярное выражение) - PullRequest
1 голос
/ 16 июня 2020

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

df = pd.DataFrame({'Names': ['ROS-053', 'ROS-54', 'ROS-51', 'ROS-051B', 'ROS-051A', 'ROS-52']}) 
df.replace(to_replace=r'[a-zA-Z]{3}-\d{2}$', value='new', regex=True)

Формат должен состоять из трех букв, за которыми следуют - затем три числа. Таким образом, ROS-51 следует заменить на ROS-051 .. А ROS-051B следует заменить на ROS-051. Я перепробовал множество вещей, но не могу понять.

Любая помощь будет принята с благодарностью :)

Ответы [ 3 ]

0 голосов
/ 16 июня 2020

Вы можете сделать:

df['Names'] = df.Names.replace('^([a-zA-Z]{3})-0?(\d{2})(.*)$', r'\1-0\2', regex=True)

Вывод:

     Names
0  ROS-053
1  ROS-054
2  ROS-051
3  ROS-051
4  ROS-051
5  ROS-052
0 голосов
/ 16 июня 2020

Вот другой способ сделать это:

df = pd.DataFrame({'Names': ['ROS-053', 'ROS-54', 'ROS-51', 'ROS-051B', 'ROS-051A', 'ROS-52']}) 
df['Names'] = df['Names'].str.replace(r'[A-Z]$', '')
df['Names'] = df['Names'].str.split('-').str[0] + '-' + df['Names'].str.split('-').str[1].apply(lambda x: x.zfill(3))
print(df)

Вывод:

     Names
0  ROS-053
1  ROS-054
2  ROS-051
3  ROS-051
4  ROS-051
5  ROS-052
0 голосов
/ 16 июня 2020

Вот один из вариантов, использующий замену регулярного выражения с помощью обратного вызова:

repl = lambda m: m.group(1) + ('00' + m.group(2))[-3:] + m.group(3)
df.str.replace(r'^([A-Z]{3}-)(\d+)(.*)$', repl)

Обратите внимание, что этот ответ является гибким и оставляет заполнение нулями либо одинарным, либо двойным di git только до трех цифр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...