python - '|'.join 不适用于包含多个项目的字符串列表
问题描述
我有以下字符串列表和代码:
mylist_bus = ["AAG","BOS","Ext"]
df.loc[df['lineId_EOD'].str.contains('AAG')]
结果如下:
ActivityType_EOD lineId_EOD
leg AAG_line7
leg AAG_line50
然后我想为这些特定值再添加一列:
for i, row in df.iterrows():
if '|'.join(mylist_bus) in df.loc[i, "lineId_EOD"]:
df.loc[i,"category_EOD"] = "bus"
df.loc[df["lineId_EOD"].str.contains('AAG')]
但是,结果和以前一样,没有任何变化:
ActivityType_EOD lineId_EOD
leg AAG_line7
leg AAG_line50
当我将列表减少到一个字符串时,例如:
mylist_bus = ["AAG"]
然后它工作正常,我得到了结果:
ActivityType_EOD lineId_EOD category_EOD
leg AAG_line7 bus
leg AAG_line50 bus
但我需要一个包含多个字符串的列表。
解决方案
Series.str.contains
默认为regex=True
. 也就是说,下面两个是等价的:
df['lineId_EOD'].str.contains('|'.join(mylist_bus))
(df['lineId_EOD'].str.contains('AAG')
| df['lineId_EOD'].str.contains('BOS')
| df['lineId_EOD'].str.contains('Ext'))
但是语法substring in string
不使用正则表达式。因此,当您检查时:
'AAG|BOS|Ext' in 'AAG_line7'
答案是False
因为该子字符串及其所有竖线不是'AAG_line7'
正如@anky 指出的那样,您可以放弃iterrows
并使用.loc
带有创建的布尔系列的调用Series.str.contains
来设置值
df.loc[df["lineId_EOD"].str.contains('|'.join(mylist_bus)), 'category_EOD'] = 'bus'
print(df)
# ActivityType_EOD lineId_EOD category_EOD
#0 leg AAG_line7 bus
#1 leg AAG_line50 bus
推荐阅读
- sql-server - 从并行数据仓库中提取列默认值
- c++ - 是否不可能将运行时整数作为模板参数传递?
- python - 使用 gTTS (python) 时如何解决“[Errno 13] Permission denied:”
- python - Pandas groupby Id 和计数选项列表/唯一值的出现次数
- python - 从熊猫数据框中的列创建新列
- python - 如何在 Ubuntu 中将 kivy 和 python 打包为可执行文件?
- flutter - 如何在 Flutter 中结合 Riverpod StreamProvider?
- javascript - BrowserWindow.on 有一个监听器 `(event: Event) => void`。为什么事件可以包含“源”键,即使它不在事件类型中?
- javascript - 根据嵌套对象键和值合并两个对象数组
- visual-studio-code - php中语言为html且前面的文本匹配正则表达式时的Vscode键绑定