首页 > 解决方案 > 根据python中的列表替换列中的几个值

问题描述

这是关于stackoverflow的一个很好的解释主题:Replaceing few values in a pandas dataframe column with another value

例子是:

BrandName Specialty
A          H
B          I
ABC        J
D          K
AB         L

解决方案是:

df['BrandName'] = df['BrandName'].replace(['ABC', 'AB'], 'A')

问题是我的数据框有点不同,我连续有两个字符串:

BrandName Specialty
A          H
B          I
ABC B      J
D          K
AB         L

所需的输出仍然是:

BrandName Specialty
A          H
B          I
A B        J
D          K
A          L

我怎样才能做到这一点?

标签: pythonpandas

解决方案


用于regex=True子串替换:

df['BrandName'] = df['BrandName'].replace(['ABC', 'AB'], 'A', regex=True)
print (df)
  BrandName Specialty
0         A         H
1         B         I
2       A B         J
3         D         K
4         A         L

另一个解决方案是必要的,如果需要避免在另一个子字符串中替换值,例如ABCD不被替换,则需要正则表达式单词边界:

print (df)
  BrandName Specialty
0    A ABCD         H
1         B         I
2     ABC B         J
3         D         K
4        AB         L


L = [r"\b{}\b".format(x) for x in ['ABC', 'AB']]

df['BrandName1'] = df['BrandName'].replace(L, 'A', regex=True)
df['BrandName2'] = df['BrandName'].replace(['ABC', 'AB'], 'A', regex=True)
print (df)
  BrandName Specialty BrandName1 BrandName2
0    A ABCD         H     A ABCD       A AD
1         B         I          B          B
2     ABC B         J        A B        A B
3         D         K          D          D
4        AB         L          A          A

编辑(来自提问者):

为了加快速度,您可以在这里查看:加速 Python 3 中的数百万个正则表达式替换

最好的trie方法是:

def trie_regex_from_words(words):
    trie = Trie()
    for word in words:
        trie.add(word)
    return re.compile(r"\b" + trie.pattern() + r"\b", re.IGNORECASE)

union = trie_regex_from_words(strings)
df['BrandName'] = df['BrandName'].replace(union, 'A', regex=True)

推荐阅读