【问题标题】:Quickest way to find partial string match between two pandas dataframes在两个熊猫数据帧之间找到部分字符串匹配的最快方法
【发布时间】:2020-10-11 16:18:55
【问题描述】:

我有两个基于位置的 pandas DataFrame。

df1:其中有一列包含完整地址,例如“Avon Road, Ealing, London, UK”。地址格式不同。

df1.address[0] --> "Avon Road, Ealing, London, UK"

df2:其中只有英国的城市,例如“伦敦”。

df2.city[5] --> "London"

在给定完整地址的情况下,我想定位第一个数据框的城市。这将在我的第一个数据帧上进行。

df1.city[0] --> "London"

方法1:对于df2中的每个城市,检查df1是否有这些城市,并将df1的索引和df2的城市存储在一个列表中。

我不确定我将如何做这件事,但我假设我会使用这段代码来确定是否存在部分字符串匹配并找到索引:

df1['address'].str.contains("London",na=False).index.values  

方法 2:对于每个 df1 地址,检查是否有任何单词与 df2 中的城市匹配,并将 df2 的值存储在列表中。

我会假设这种方法更直观,但它的计算成本会更高吗?假设 df1 有数百万个地址。

如果这是一个愚蠢或简单的问题,我们深表歉意!任何指向最有效代码的方向都会有所帮助:)

【问题讨论】:

  • 第二个方法,见answerstr.extract,其中L代表你L=df2.city.tolist()或类似的东西
  • df1df2 大约包含多少行?
  • @JérômeRichard df1 包含大约 300,000 行(增长),df2 包含 240 行(固定)。

标签: python pandas performance


【解决方案1】:

方法 2 确实是一个好的开始。但是,使用 Python 字典而不是列表应该快得多。 这是一个示例代码:

cityIndex = set(df2.city)

addressLocations = []
for address in df1.address:
    location = None
    # Warning: ignore characters like '-' in the cities
    for word in re.findall(r'[a-zA-Z0-9]+', address):
        if word in cityIndex:
            location = word
            break
    addressLocations.append(location)
df1['city'] = addressLocations

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2020-11-28
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多