如何从pandas现有列提取指定列表内的子串创建新列
问题原因
你原有代码运行失败的核心原因是lambda中写的生成器表达式会直接返回生成器对象,而非单个匹配值,无法直接赋值给DataFrame的列。
解决方案
方案1:修正apply写法(适合小数据量场景)
用next()方法取生成器的第一个匹配结果,无匹配时返回np.nan:
import pandas as pd import numpy as np state_us = ['Ohio', 'California'] fake_df = pd.DataFrame(np.array(['Route 66, Ohio, US', 'California US']), columns = ['Address']) fake_df['State'] = fake_df['Address'].apply( lambda x: next((element for element in state_us if element in x), np.nan) )
方案2:向量化正则提取(适合大数据量场景,性能更优)
用pandas原生的str.extract方法实现,无需逐行遍历:
# 将州名列表拼接为正则「或匹配」模式 pattern = '|'.join(state_us) # 提取第一个匹配到的子串,无匹配返回NaN fake_df['State'] = fake_df['Address'].str.extract(f'({pattern})', expand=False)
运行两种方案后得到的fake_df都和你需要的results_df完全一致。
内容的提问来源于stack exchange,提问作者Filippo Sebastio
相关产品推荐
相关产品推荐

