【发布时间】: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 添加更多内容,因为它们并不都在状态代码中......