首页 > 解决方案 > '|'.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

但我需要一个包含多个字符串的列表。

标签: pythonpandas

解决方案


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

推荐阅读