如何使用Pandas实现可变长度值切片?解决姓名提取NaN问题
解决Pandas中从全名提取姓氏的问题
问题场景
现有包含Full(全名)和First(名字)列的DataFrame,需要新增Last列存储姓氏,规则是从全名中去掉名字部分(名字长度+1的位置开始截取)。但直接用Series作为切片索引会返回NaN,需实现正确提取逻辑。
原始数据示例:
import pandas as pd columns = ['Full', 'First'] data = [('Joe Smith', 'Joe'), ('Bobby Sue Ford', 'Bobby Sue'), ('Current Resident', 'Current Resident'), ('', '')] df = pd.DataFrame(data, columns=columns)
正确实现方法
方法1:逐行切片处理(最直接)
利用apply逐行计算切片位置,用整数索引完成截取,同时处理空值和名字与全名相同的情况:
df['Last'] = df.apply(lambda row: row['Full'][len(row['First']) + 1:] if row['First'] else '', axis=1)
方法2:字符串替换截取
通过替换掉名字部分,再去除多余空格,实现姓氏提取:
df['Last'] = df.apply(lambda row: row['Full'].replace(row['First'], '', 1).strip() if row['First'] else '', axis=1)
方法3:按空格分割拼接
针对名字和姓氏以空格分隔的场景,分割后取名字之外的部分拼接:
df['Last'] = df.apply( lambda x: ' '.join(x['Full'].split()[len(x['First'].split()):]) if pd.notna(x['First']) and x['First'] else '', axis=1 )
结果验证
运行代码后输出的DataFrame:
Full First Last 0 Joe Smith Joe Smith 1 Bobby Sue Ford Bobby Sue Ford 2 Current Resident Current Resident 3
关键说明
- 直接使用
df['Full'].str.slice(df['First'].str.len() + 1)失败的原因:str.slice仅接受整数/标量作为索引,无法识别Series类型的动态索引。 apply(axis=1)实现逐行处理,此时len(row['First'])是单个整数,可作为合法的切片索引。- 代码中加入了空值、全名与名字完全一致的场景处理,避免出现无效结果或多余空格。
内容的提问来源于stack exchange,提问作者J Web
相关产品推荐
相关产品推荐

