如果一列在熊猫DF中的(状态)列表中包含一个substring(美国状态)



我刮了twitter,并想整理推文的位置。所有数据都在熊猫的数据框架中,我正在使用python3。我想在位置列上做一些工作,看起来与此相似:

['位置']
亚利桑那州斯科茨代尔
伦敦,英国
美国
(无值(
Mission Viejo,CA

等...

位置数据凌乱,我想简化它,首先将美国分类为一个。

为此,我有一个状态代码列表:state_list。我正在尝试替换包含任何状态代码的单元格。我已经通过硬编码特定的状态找到了如何做到这一点。

df.loc[df.location.str.contains('CA'), 'location'] = 'USA'
上面的

比较整个列值等于state_list中的项目

但是我无法使用state_list做到这一点,我尝试使用isin(state_list(代替str.contains('ca'(

df.loc[df.location.isin(state_list), 'location'] = 'USA'

似乎什么都不做。我还尝试了一个用于循环的循环,并在下面的代码中进行了各种迭代,但无济于事。

for states in state_list:
    if df.loc[df.location.isin(state_list)]:
        df['location'] = 'USA'

我觉得这个问题应该有一个"简单"的答案,但是找不到解决方案,现在已经开始圆圈,所以决定问。任何帮助都非常感谢,并感谢您的阅读。

答案在下面,感谢您的帮助。

pat = r', b{}b'.format('|'.join(state_list))
df.loc[df.location.str.contains(pat), 'location'] = 'USA'

正如Håken指出的那样,这可能会导致"加拿大CA意外匹配"(例如(。有关更多信息,请参见下面的评论答案。

您真的很接近,需要state_list中的join |中的所有值,用于REGEX OR,用于state_list

感谢@Jon Clements对word boundary的更好解决方案:

pat = r'b{}b'.format('|'.join(state_list))
df.loc[df.location.str.contains(pat, na=False), 'location'] = 'USA'

edit1:

感谢 @håken盖子的另一个建议 -

如果状态始终是在逗号和空间之后出现的,则可以通过使其更具体来加快速度。

pat = r', ({})$'.format('|'.join(state_list))

样本:

print (df)
            location
0     Scottsdale, AZ
1         London, UK
2                USA
3                NaN
4  Mission Viejo, CA
state_list = ['AZ','CA']
pat = r'b{}b'.format('|'.join(state_list))
df.loc[df.location.str.contains(pat, na=False), 'location'] = 'USA'
print (df)
     location
0         USA
1  London, UK
2         USA
3         NaN
4         USA

最新更新