代码之家  ›  专栏  ›  技术社区  ›  user9092346

在保持变量的同时更改pandas中的字符串

  •  1
  • user9092346  · 技术社区  · 6 年前

    我在pandas(df['case'])中的数据包含两种引用美元金额的方法:

    • 他花了500美元买电脑。
    • 他花了500美元买了这台电脑。
    • 交易以美元和欧元进行。

    区别就在空白处。我现在想用“USD”替换“USD”,但前提是USD后面跟一个数字-同时保留数字。

    df['case'] = df['case'].str.replace('USD ', 'USD', re.IGNORECASE)
    

    将不起作用,因为它也将包含不跟随数字的实例(见第三示例)。

    df['case'] = df['case'].str.replace('USD (\d+)', 'USD', re.IGNORECASE)
    

    这将只匹配后跟数字的情况,但也将替换数字。有没有办法告诉它找到变量,然后替换变量之外的所有内容?基本上:

    df['case'] = df['case'].str.replace('USD (\d+)', 'USD(\d+)', re.IGNORECASE)
    

    第二个(\D+)不是字面上的,而是作为一个位置的持有者,之前的数字将被再次插入这里。

    我也试过:

    for row in df['case'].str.contains('USD (\d+), re.IGNORECASE):
       df['case'] = df['case'].str.replace('USD ', 'USD', re.IGNORECASE)
    

    后者不能在行上迭代,只能在包含字符串的行中执行更改。后者的解决方案将有助于解决许多其他问题。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Wiktor Stribiżew    6 年前

    使用

    (?i)USD\s+(?=\d)
    

    细节

    • (?i) -启用不区分大小写搜索
    • USD -文字 美元
    • \s+ -1+空格字符
    • (?=\d) -(积极向前看确保)下一个字符应该是一个数字不会添加到匹配值,因此不会被替换。

    熊猫:

    df['case'] = df['case'].str.replace(r'(?i)USD\s+(?=\d)', 'USD')
    

    regex demo

    如果你需要保留 美元 在原来的情况下 使用

    df['case'] = df['case'].str.replace(r'(?i)(USD)\s+(?=\d)', r'\1')
    

    也就是说,抓住 美元 进入捕获组,然后使用 \1 返回引用/占位符,引用字符串替换模式中的组值。