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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:13:25