Pandas:从字符串中提取出出发城市/目的城市

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

代码解释:

  1. 我们首先读取了城市列表数据集,并使用了usecols参数只读取了city_asciicountry列的数据。
  2. 我们创建了一个包含出发城市和目的城市的测试数据集,并使用pandas.DataFrame函数将其转换为数据框。
  3. 我们使用join函数将城市列表转换为一个带有|分隔符的字符串,并将其定义为正则表达式模式。
  4. 我们使用pandas.Series.str.extract函数和正则表达式模式提取出出发城市和目的城市。expand=False参数表示返回一个数据框,而不是一个包含一列的数据框。
  5. 我们将提取出来的结果分别存储在了df数据框的origindestination列中。

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

代码解释:

  1. 我们创建了一个包含出发城市和目的城市的测试数据集,并使用pandas.DataFrame函数将其转换为数据框。
  2. 我们将城市列表转换为一个列表,并将其存储在了cities_list变量中。
  3. 我们定义了一个extract_city_name函数,用于从字符串中提取城市名称。该函数首先使用FuzzyWuzzy模糊匹配算法找到最匹配的城市名称,并且只有在匹配得分超过80时才返回结果。
  4. 我们使用pandas.Series.apply函数和extract_city_name函数提取出出发城市和目的城市。
  5. 我们将提取出来的结果分别存储在了df数据框的origindestination列中。

总结

以上就是使用Pandas从字符串中提取出出发城市和目的城市的两种方法。第一种方法使用了正则表达式,第二种方法使用了FuzzyWuzzy模糊匹配算法。在使用这些方法时,需要选择一个适合自己数据的方法并根据实际情况对其进行调整。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程