在Python中匹配字符串元素(apply函数)



我有Twitter数据,我试图返回与用户自我描述的位置相匹配的所有州缩写。我已经创建了一个匹配函数并将其应用于我的数据帧,但由于某种原因,我没有返回任何匹配(所有nan),尽管在原始数据中存在状态缩写。

我的州列表包括所有50个州

states = ['AL','AK', 'AZ', 'AR', 'CA'…]

我的数据框架的一个小样本看起来像这样:

user_location            text
0   CO                           australia to manufacture covid vaccine and g...
1   Seattle, WA                  coronavirusvaccine coronavaccine covidvaccine ...
2   nan                          deaths due to covid in affected countries re...
3   Atlanta, GA                  subhashree stay safe di amp da

我创建了以下嵌套循环函数,以尝试从我的状态列表中返回具有user_location列的位置匹配:

def match(user_location):
for state in states:
if state in tweets2.user_location:
return state
else:
return np.nan

然后通过应用函数

创建返回匹配的新列:
tweets2['State'] = tweets2['user_location'].apply(match)

但是,当我知道user_location列中肯定有状态缩写时,我得到的所有返回值都是NaN值。

我使用以下代码检查:

tweets2['State'].notnull().value_counts()

任何帮助解决这个问题将非常感谢!

在您的代码中,只要没有找到一个状态,就返回nan,如下面的

所示
def match(user_location):
for state in states:
if state in tweets2.user_location:
return state
else:
return np.nan

您应该将其更改为只有在检查了所有状态后才返回nan。你可以这样写,

def match(user_location):
for state in states:
if state in tweets2.user_location:
return state
return np.nan

总是在循环的第一次迭代之后返回值。尽量避免在循环中使用return。让我们重新构建循环:

def match(user_location):
user_state = np.nan
for state in states:
if state in user_location:
user_state = state
break
return user_state
print(match(tweets2.user_location))

你可以用集合做一些更优雅的事情。如果您将states设置为一个集合,那么您可以执行以下操作:states.intersection(tweets2.user_location)将返回两个集合中都存在的项的集合。

相关内容

  • 没有找到相关文章

最新更新