我的 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)
后者无法迭代行,而仅在包含字符串的行中执行更改。后者的解决方案也将有助于解决其他问题。
最佳答案
使用
(?i)USD\s+(?=\d)
详细信息
-
(?i)
- 启用不区分大小写的搜索 -
USD
- 字面量USD
-
\s+
- 1 个以上空白字符 -
(?=\d)
-(积极的前瞻确保)下一个字符应该是不会添加到匹配值中的数字,因此不会被替换。
在 Pandas 中:
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
反向引用/占位符引用字符串替换模式中的该组值。
关于python - 在保持变量的同时更改 Pandas 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50944285/