如何在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
相关产品推荐
相关产品推荐

