【问题标题】:Replace values in dataframe column (regex)替换数据框列中的值(正则表达式)
【发布时间】:2020-10-06 01:00:09
【问题描述】:

我有一个带有名称的数据框列:

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。我已经尝试了很多东西,但似乎无法弄清楚。

任何帮助将不胜感激:)

【问题讨论】:

    标签: python regex pandas replace


    【解决方案1】:

    你可以这样做:

    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开头?另外,您的答案不适合三个字母后面的数字可能只是一位数字的可能性。
    • @TimBiegeleisen 因此?0 之后?
    【解决方案2】:

    这是一个使用带有回调的正则表达式替换的选项:

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

    请注意,此答案很灵活,将用零填充一位或两位数,仅保留三位数字。

    【讨论】:

    • 仍然很难:-)
    • 我不经常使用 Pandas,但我可以确认 re.sub 逻辑工作正常。
    • 不是,不是,ROS-52 给了ROS-0
    【解决方案3】:

    这是另一种方法:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-20
      • 2018-04-11
      • 2023-01-11
      • 1970-01-01
      • 2017-05-24
      • 2020-09-02
      • 1970-01-01
      • 2020-01-21
      相关资源
      最近更新 更多