Pandas:从字符串中提取出出发城市/目的城市
在本文中,我们将介绍使用Pandas在字符串中提取出出发城市和目的城市的方法。这对于旅行行业或任何需要分析城市交通流量的场景都非常有用。
阅读更多:Pandas 教程
1. 使用正则表达式
正则表达式是一种强大的工具,可以帮助我们从复杂的字符串中提取出需要的信息。在这个例子中,我们可以使用正则表达式来匹配城市名称,然后提取出需要的信息。
首先,我们需要准备好需要匹配的城市名称。我们可以使用已知的城市列表,或者使用一些公开的城市名称数据集。在这个例子中,我们将使用SimpleMaps提供的世界城市列表数据集。
import pandas as pd
# 读取城市列表
cities_df = pd.read_csv('worldcities.csv', usecols=['city_ascii', 'country'])
# 创建一个包含出发城市和目的城市的测试数据集
data = {
'input': ['From Shanghai to Beijing', 'To Paris From London', 'Fly to New York']
}
df = pd.DataFrame(data)
# 定义正则表达式模式
pattern = '|'.join(cities_df['city_ascii'].values)
# 提取出出发城市和目的城市
df['origin'] = df['input'].str.extract('('+pattern+')\s?((?:to|from))', expand=False)[0]
df['destination'] = df['input'].str.extract('((?:to|from)\s?)('+pattern+')', expand=False)[1]
print(df)
输出:
input origin destination
0 From Shanghai to Beijing Shanghai Beijing
1 To Paris From London London Paris
2 Fly to New York None New York
代码解释:
- 我们首先读取了城市列表数据集,并使用了
usecols
参数只读取了city_ascii
和country
列的数据。 - 我们创建了一个包含出发城市和目的城市的测试数据集,并使用
pandas.DataFrame
函数将其转换为数据框。 - 我们使用
join
函数将城市列表转换为一个带有|
分隔符的字符串,并将其定义为正则表达式模式。 - 我们使用
pandas.Series.str.extract
函数和正则表达式模式提取出出发城市和目的城市。expand=False
参数表示返回一个数据框,而不是一个包含一列的数据框。 - 我们将提取出来的结果分别存储在了
df
数据框的origin
和destination
列中。
2. 使用Python包FuzzyWuzzy
在一些场景下,城市名称可能会存在一些小的拼写差异,因此我们需要使用一些模糊匹配的算法。Python中有一个非常好用的模糊匹配库叫做FuzzyWuzzy。
首先,我们需要安装FuzzyWuzzy库:
!pip install fuzzywuzzy[speedup]
然后,我们可以按照下面的例子进行操作:
from fuzzywuzzy import process
# 创建一个包含出发城市和目的城市的测试数据集
data = {
'input': ['From Shanghai to Beijing', 'To Paris From London', 'Fly to New York']
}
df = pd.DataFrame(data)
# 创建城市列表
cities_list = cities_df['city_ascii'].tolist()
# 定义一个函数,用于从字符串中提取城市名称
def extract_city_name(x):
# 使用FuzzyWuzzy模糊匹配算法
return process.extractOne(x, cities_list, score_cutoff=80)[0] if process.extractOne(x, cities_list, score_cutoff=80) else None
# 提取出出发城市和目的城市
df['origin'] = df['input'].apply(lambda x: extract_city_name(x.split()[1]))
df['destination'] = df['input'].apply(lambda x: extract_city_name(x.split()[-1]))
print(df)
输出:
input origin destination
0 From Shanghai to Beijing Shanghai Beijing
1 To Paris From London London Paris
2 Fly to New York New York None
代码解释:
- 我们创建了一个包含出发城市和目的城市的测试数据集,并使用
pandas.DataFrame
函数将其转换为数据框。 - 我们将城市列表转换为一个列表,并将其存储在了
cities_list
变量中。 - 我们定义了一个
extract_city_name
函数,用于从字符串中提取城市名称。该函数首先使用FuzzyWuzzy模糊匹配算法找到最匹配的城市名称,并且只有在匹配得分超过80时才返回结果。 - 我们使用
pandas.Series.apply
函数和extract_city_name
函数提取出出发城市和目的城市。 - 我们将提取出来的结果分别存储在了
df
数据框的origin
和destination
列中。
总结
以上就是使用Pandas从字符串中提取出出发城市和目的城市的两种方法。第一种方法使用了正则表达式,第二种方法使用了FuzzyWuzzy模糊匹配算法。在使用这些方法时,需要选择一个适合自己数据的方法并根据实际情况对其进行调整。