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

如何对DataFrame多列批量应用函数提取方括号前的内容?

批量提取DataFrame多列中“[”前的内容

原始DataFrame:

ABC
0word[another[third[
1some[one[four[
2this[two[five[

需求为提取每列中“[”之前的单词并替换原列值,目前逐列处理的可行代码如下:

df.A = df.A.apply(lambda x: re.findall("([\w\s]*)\[", x)[0] if '[' in x else x)

但尝试以下批量处理代码时无效:

df[['A', 'B', 'C']] = df[['A', 'B', 'C']].apply(lambda x: re.findall("([\w\s]*)\[", x)[0] if '[' in x else x)

问题出在apply()默认按列(axis=0)执行,传入lambda的是整列的Series对象,而非单个元素,导致正则匹配逻辑无法正确作用于每个单元格。

正确的批量处理方法

方法1:使用applymap()处理每个元素

applymap()会遍历DataFrame的每个单元格,对单个元素应用处理逻辑,完全匹配需求:

import re
import pandas as pd

df[['A', 'B', 'C']] = df[['A', 'B', 'C']].applymap(
    lambda x: re.findall("([\w\s]*)\[", x)[0] if '[' in x else x
)

方法2:指定apply()按行处理

若坚持使用apply(),需设置axis=1按行处理,再对每行的每个元素单独应用逻辑:

df[['A', 'B', 'C']] = df[['A', 'B', 'C']].apply(
    lambda row: row.apply(lambda x: re.findall("([\w\s]*)\[", x)[0] if '[' in x else x),
    axis=1
)

方法3:使用str.extract()(推荐,更高效)

Pandas内置的字符串提取方法str.extract()可直接提取正则匹配组,无需循环,效率更高:

df[['A', 'B', 'C']] = df[['A', 'B', 'C']].str.extract("([\w\s]*)\[")

注:若单元格中无“[”,该方法会返回NaN,可根据需求添加fillna()处理缺失值。

处理后得到目标结果:

ABC
0wordanotherthird
1someonefour
2thistwofive

内容的提问来源于stack exchange,提问作者Arie Neu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:43:26