首页 > 解决方案 > Python:替换不区分大小写的标志不起作用

问题描述

在我的数据框中,我想用一个一致的字符串替换不同的表示方式。例子:

  1. 将 [COM, COMMERCIAL] 替换为“商业”。
  2. 将 [FALSE, False, false, NO, No, N] 替换为 N 等等。

要替换的值列表和替换值来自另一个数据帧,并且会在我遍历主数据帧中的每一列时发生变化。

应该工作的理想解决方案是:

dfPA[col] = dfPA[col].replace(f'(?i){valold}', key)

where
valold = ['COM', 'COMMERCIAL']
key = 'Commercial'

这行不通。也许是因为 valold 是一个列表。所以我尝试了:

for val in valold:
    dfPA[col] = dfPA[col].replace(f'(?i){val}', key)

它仍然不起作用。有什么想法吗?

注意:我不能使用dfPA[col] = dfPA[col].str.replace(valold, key, case=False, regex=False),因为正如这里所解释的,它也会替换子字符串。然后我看到的不是“商业”,而是“ComCom ...商业”

标签: pythonpandasreplaceignore-case

解决方案


要么 要么str.replace可以使用。只需确保模式与整个单元格匹配的字符串的开始 ( ) 和结束 ( ) 匹配。replace ^$

str.replace

for val in valold:
    dfPA[col] = dfPA[col].str.replace(rf'^{val}$', key, case=False, regex=True)

replace

for val in valold:
    dfPA[col] = dfPA[col].replace(rf'(?i)^{val}$', key, regex=True)

*regex=False默认情况下,replace如果regex没有设置,不区分大小写修饰符将无法用于替换,regex=True因为它将逐字匹配字符“(?i)”。


样本数据和输出:

import pandas as pd

dfPA = pd.DataFrame({
    'col': ['COM', 'COMMERCIAL', 'COmMErCIaL', 'Something else',
            'comical']
})

valold = ['COM', 'COMMERCIAL']
key = 'Commercial'
col = 'col'
for val in valold:
    dfPA[col] = dfPA[col].str.replace(rf'^{val}$', key, case=False, regex=True)

print(dfPA)
              col
0      Commercial
1      Commercial
2      Commercial
3  Something else
4         comical

推荐阅读