基于预定义名单拆分Python DataFrame列为两列的方法
基于预定义姓名元组拆分DataFrame列的解决方案
嗨,我来帮你搞定这个问题!你说得没错,str.split()确实只支持单个字符串作为分隔符,没法直接传入你的姓名元组,但我们有两种实用的方法来实现你想要的列拆分:
方法一:正则表达式提取(高效推荐)
利用正则表达式的备选匹配特性,把你的姓名元组转换成正则模式,然后用str.extract()直接提取出姓名和剩余信息。这种方法效率很高,适合处理大数据集。
步骤如下:
- 构造匹配开头姓名的正则模式(用
|分隔所有姓名,同时用re.escape()避免姓名里的特殊字符干扰匹配) - 用
str.extract()从Text列中提取两个分组:姓名和剩余信息
示例代码:
import re import pandas as pd # 你的原始DataFrame df = pd.DataFrame({ 'Text': [ 'John Smith abc def ghi jkl', 'Michael Smith abc def ghi jkl', 'Liz Jones abc def ghi jkl' ] }) names = ('John Smith','Michael Smith','Liz Jones') # 构造正则匹配模式:匹配开头的姓名,然后匹配后续的所有内容 pattern = r'^(' + '|'.join(re.escape(name) for name in names) + r')\s+(.*)$' # 提取并生成新列 df[['Name', 'Information']] = df['Text'].str.extract(pattern) # 可选:删除原始的Text列 df = df.drop('Text', axis=1)
运行后你就能得到期望的结果:
Name Information 0 John Smith abc def ghi jkl 1 Michael Smith abc def ghi jkl 2 Liz Jones abc def ghi jkl
方法二:自定义函数+apply(直观易懂)
如果你觉得正则有点绕,可以用apply()结合自定义函数,逐个检查每条文本是否以某个姓名开头,找到后拆分。这种方法逻辑直观,适合小数据集或者需要自定义判断规则的场景。
示例代码:
import pandas as pd df = pd.DataFrame({ 'Text': [ 'John Smith abc def ghi jkl', 'Michael Smith abc def ghi jkl', 'Liz Jones abc def ghi jkl' ] }) names = ('John Smith','Michael Smith','Liz Jones') # 自定义拆分函数 def split_by_name(text): for name in names: if text.startswith(name): # 跳过姓名后的空格,返回姓名和剩余内容 return [name, text[len(name)+1:]] # 处理不匹配任何姓名的情况(可选) return [None, text] # 应用函数并生成新列 df[['Name', 'Information']] = df['Text'].apply(split_by_name).apply(pd.Series) # 可选:删除原始Text列 df = df.drop('Text', axis=1)
两种方法都能实现你的需求,你可以根据数据集大小和个人偏好选择~
内容的提问来源于stack exchange,提问作者SOK
相关产品推荐
相关产品推荐

