我有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)
将返回两个集合中都存在的项的集合。