Pandas基于跨列过滤从DataFrame目标列提取文本生成新列
Pandas 跨列约束派生列提取实现
核心实现逻辑统一为两步:
- 初始化目标派生列
my_new_col全值为None,覆盖所有不满足要求的场景 - 通过布尔掩码锁定仅State列为Idaho的行范围,在该范围内对Text列执行指定的文本/正则匹配提取,匹配失败的行自动保留初始的
None值
场景1:固定关键词提取
实现代码
import pandas as pd # 构造示例输入DataFrame df = pd.DataFrame({ 'State': ["Idaho", "Washington", "Oregon", "Idaho", "Oregon"], 'Text': ["Lime Light", "New Egg", "Lime Inc", "Monteray", "NovaDing"] }) # 1. 初始化派生列 df['my_new_col'] = None # 2. 生成跨列过滤掩码:仅保留State为Idaho的行 state_mask = df['State'].eq('Idaho') # 3. 在掩码范围内,提取Text中匹配的固定关键词Lime df.loc[state_mask, 'my_new_col'] = df.loc[state_mask, 'Text'].str.extract( pat=r'(Lime)', # 捕获组包裹目标关键词,直接返回匹配值 expand=False )
运行结果
State Text my_new_col 0 Idaho Lime Light Lime 1 Washington New Egg None 2 Oregon Lime Inc None 3 Idaho Monteray None 4 Oregon NovaDing None
注意:俄勒冈州行的Text虽然包含Lime,但因为不满足State=Idaho的前置条件,不会被提取,完全匹配需求。
场景2:正则规则匹配提取
实现代码
和场景1的逻辑完全一致,仅需要替换正则匹配规则即可:
import pandas as pd # 构造示例输入DataFrame df = pd.DataFrame({ 'State': ["Idaho", "Washington", "Oregon", "Idaho", "Oregon"], 'Text': ["1,234 Light", "New Egg", "Lime Inc", "1223 Ring", "NovaDing"] }) # 1. 初始化派生列 df['my_new_col'] = None # 2. 生成跨列过滤掩码 state_mask = df['State'].eq('Idaho') # 3. 在掩码范围内,匹配正则规则对应的内容 df.loc[state_mask, 'my_new_col'] = df.loc[state_mask, 'Text'].str.extract( pat=r'(\d,\d\d\d)', # 替换为目标正则表达式,捕获组包裹匹配模式 expand=False )
运行结果
State Text my_new_col 0 Idaho 1,234 Light 1,234 1 Washington New Egg None 2 Oregon Lime Inc None 3 Idaho 1223 Ring None 4 Oregon NovaDing None
注意:索引为3的行虽然State为Idaho,但Text内容没有符合正则规则的“数字,三位数字”格式,因此匹配失败保留None值,和预期一致。
实现优势
- 全程使用Pandas向量化操作,没有逐行循环,处理大规模数据时运行效率远高于apply循环
- 跨列约束通过独立的布尔掩码实现,后续扩展过滤条件(比如增加State=Idaho且Text长度大于10的规则)时,只需要修改掩码表达式,不需要改动提取逻辑
- 提取逻辑和过滤逻辑完全解耦,后续调整匹配规则时不会影响前置约束的执行
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

