You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中新增列并提取指定地址片段?

没问题,这两个需求都能轻松实现,咱们一步步来解决:

一、直接将筛选结果存入Pandas新增列

你之前用iterrows循环的方式虽然可行,但Pandas本身提供了更高效的矢量化操作,不用手动循环就能完成。咱们可以直接新增列来标记符合条件的行,或者把符合条件的描述内容存入新列,示例代码如下:

import pandas as pd

# 先还原你的原始DataFrame
df = pd.DataFrame({
    'id': [1, 2, 3],
    'Description': [
        'POS Transfer A&W MONTREAL QC',
        'MKLI QC Montreal DOLLARAMA',
        'PC - PAYMENT FROM - *****11*22'
    ]
})

provinces = ["qc", "on"]
# 构造正则表达式,确保匹配完整的省份单词(避免误匹配包含这些字符的其他词)
province_pattern = r'\b(' + '|'.join(provinces) + r')\b'

# 新增列:标记该行是否包含省份关键词
df['has_address'] = df['Description'].str.lower().str.contains(province_pattern, regex=True)

# 或者直接把符合条件的描述内容存入新列,不符合的设为NaN
df['address_candidate'] = df['Description'].where(df['has_address'])

运行后你的DataFrame就会多出这两个列,不用再手动维护数组b,后续处理也更方便。

二、提取省份左右各一个词的片段

要实现这个需求,咱们可以写一个自定义函数,结合apply来处理每一行的描述文本。核心思路是把文本拆分成单词,找到省份所在的位置,然后截取它前一个(如果存在)和后一个(如果存在)单词的范围:

def extract_fragment(text, target_provinces):
    # 处理空值的情况
    if pd.isna(text):
        return None
    # 把文本拆分成单词列表
    words = text.split()
    # 转成小写方便匹配省份
    lower_words = [word.lower() for word in words]
    
    for idx, word in enumerate(lower_words):
        if word in target_provinces:
            # 确定截取的起始和结束索引:确保不会超出列表范围
            start_idx = max(0, idx - 1)
            end_idx = min(len(words), idx + 2)
            # 拼接成需要的片段
            return ' '.join(words[start_idx:end_idx])
    # 如果没找到省份,返回None
    return None

# 应用函数到address_candidate列,生成最终的片段列
df['address_fragment'] = df['address_candidate'].apply(lambda x: extract_fragment(x, provinces))

运行后你会得到:

  • 第一行的address_fragment是A&W MONTREAL QC
  • 第二行是QC Montreal DOLLARAMA
  • 第三行是NaN(因为没有省份关键词)

如果想要更简洁的方式,也可以用正则表达式来实现,不过上面的方法更直观,方便你根据实际情况调整规则(比如处理特殊分隔符、多空格等)。

内容的提问来源于stack exchange,提问作者Jerry George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:32:39