我有一个数据帧列,上面有名称:
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。我尝试了很多事情,但似乎无法弄清楚。
任何帮助将不胜感激:(
你可以做:
df['Names'] = df.Names.replace('^([a-zA-Z]{3})-0?(d{2})(.*)$', r'1-02', regex=True)
输出:
Names
0 ROS-053
1 ROS-054
2 ROS-051
3 ROS-051
4 ROS-051
5 ROS-052
下面是使用正则表达式替换和回调的一个选项:
repl = lambda m: m.group(1) + ('00' + m.group(2))[-3:] + m.group(3)
df.str.replace(r'^([A-Z]{3}-)(d+)(.*)$', repl)
请注意,此答案很灵活,并且仅将零留到三位数的零或两位数。
这是另一种方法:
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