python - 根据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
我怎样才能做到这一点?
解决方案
用于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)
推荐阅读
- java - 递归算法的大 O 复杂度
- java - Spring Boot 应用程序忽略导入的配置
- selenium - 允许自动化桌面应用程序的框架
- sql - 计算列中不同值实例的数量
- javascript - 外部加载的同一版本 jquery 的两个不同变体
- javascript - 用 momentjs 计算时间
- install4j - Install4j,“文件关联”(选择)屏幕未出现在 Unix 安装程序中
- database - DB2 Server Discovery 是否可以通过网络进行?
- bash - Bindsym 不执行 i3wm 命令
- https - ESP8266 通过 HTTPS 从 GET 请求中跳过一些数据