【问题标题】:If a column contains a substring ( a US state) in a list (of states) change value (to USA) in a pandas df如果一列在(州)列表中包含子字符串(美国州),则在熊猫 df 中更改值(到美国)
【发布时间】:2018-02-24 11:54:54
【问题描述】:

我刮了推特,想整理推文的位置。所有数据都在 pandas 数据框中,我使用的是 Python 3。我想在 location 列上做一些工作,看起来类似于:

['位置']
亚利桑那州斯科茨代尔
英国伦敦
美国
(无价值)
加利福尼亚州米申维耶荷

等等……

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

为此,我有一个州代码列表: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 循环,对下面的代码进行了各种迭代,但无济于事。

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 的意外匹配(例如)。”有关更多信息,请参阅下面的 cmets 答案。

【问题讨论】:

  • 您正在比较整个列值等于 state_list 中的一个项目 - 大概您希望检查它是否包含任何项目的子字符串?您可能可以从 df.loc[df.location.str.contains('|'.join(state_list)), 'location'] = 'USA' 开始,但我想除非您更准确地首先隔离看起来像状态的内容,否则这会很容易被击中......
  • 非常感谢@JonClements 到目前为止一直有效。我希望我现在早点问。是的,我确实想比较任何项目的子字符串,现在我将尝试向 state_list 添加更多内容,因为它们并不都在状态代码中......

标签: python pandas


【解决方案1】:

你真的很亲密,需要state_list 中的所有值| 用于正则表达式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'

编辑1:

感谢@Håken Lid 提出另一个建议 -

如果状态总是出现在逗号和空格之后,您可以通过使其更加具体来加速正则表达式。

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

【讨论】:

  • 稍微好一点的可能是:r'\b{}\b'.format('|'.join(state_list))... 至少那时它只会考虑单词...
  • @JonClements - 再次感谢您:)
  • 如果状态总是出现在逗号和空格之后,您可以通过使其更加具体来加速正则表达式。 r', ({})$'.format('|'.join(state_list))
  • 非常感谢@jezrael 和其他人的编辑。很高兴知道我很接近
  • 要使单词边界按预期工作,您需要使用括号中的状态并将其包裹起来并形成一个正则表达式分组:r'\b({})\b。如果不是,则正则表达式引擎将仅将\bs 视为第一个和最后一个选项的一部分。因此,您可能会在 CANADA 中意外匹配 CA(例如)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多