在保持可变的情况下更改熊猫中的字符串

时间:2018-06-20 09:02:06

标签: python regex pandas

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

  • 他为PC支付了500美元。
  • 他为PC支付了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 个答案:

答案 0 :(得分:1)

使用

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

详细信息

  • (?i)-启用不区分大小写的搜索
  • USD-文字USD
  • \s+-1个以上的空格字符
  • (?=\d)-(确保前瞻性)下一个字符应为不会添加到匹配值的数字,因此不会被替换。

在熊猫中:

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

请参见regex demo

如果您需要将USD保留为原始格式,请使用

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

也就是说,将USD捕获到捕获组中,然后使用\1反向引用/占位符从字符串替换模式中引用该组值。