如何对DataFrame多列批量应用函数提取方括号前的内容?
批量提取DataFrame多列中“[”前的内容
原始DataFrame:
| A | B | C | |
|---|---|---|---|
| 0 | word[ | another[ | third[ |
| 1 | some[ | one[ | four[ |
| 2 | this[ | 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()处理缺失值。
处理后得到目标结果:
| A | B | C | |
|---|---|---|---|
| 0 | word | another | third |
| 1 | some | one | four |
| 2 | this | two | five |
内容的提问来源于stack exchange,提问作者Arie Neu
相关产品推荐
相关产品推荐

