我刮了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