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

如何修改DataFrame中name列字符串的首尾元素并解决赋值报错

问题:修改DataFrame中name列的首尾数字值

现有如下结构的DataFrame:

data = {
    'name': ['101 blueberry 2023', '102 big cat 2023', '103 small white dog 2023'],
    'number': [116, 118, 119]}
df = pd.DataFrame(data)

输出结果:

name  number          
0        101 blueberry 2023     116         
1          102 big cat 2023     118           
2  103 small white dog 2023     119  

需求是修改name列的首尾数字:将开头的数字替换为对应number列的值,末尾的数字替换为2024,最终效果:

name  number   
0        116 blueberry 2024     116          
1          118 big cat 2024     118          
2  119 small white dog 2024     119  

尝试拆分name列为列表后修改首尾元素时,遇到错误:

df['name_pieces'] = df['name'].str.split(' ')
# 尝试赋值时出错
df['name_pieces'].str[0] = df['number']

错误信息:

TypeError: 'StringMethods' object does not support item assignment

解决方案

方法1:拆分后重组(直观易懂)

通过apply遍历每一行,拆分字符串为列表后修改首尾元素,再合并为字符串:

def update_name(row):
    # 拆分字符串为列表
    pieces = row['name'].split(' ')
    # 替换第一个元素为number列的字符串形式
    pieces[0] = str(row['number'])
    # 替换最后一个元素为2024
    pieces[-1] = '2024'
    # 合并为新字符串
    return ' '.join(pieces)

# 应用函数更新name列
df['name'] = df.apply(update_name, axis=1)

方法2:正则表达式替换(简洁高效)

利用正则匹配开头和结尾的数字,分别替换为目标值:

import re

df['name'] = df.apply(
    lambda row: re.sub(r'^\d+', str(row['number']), re.sub(r'\d+$', '2024', row['name'])),
    axis=1
)
  • r'^\d+':匹配字符串开头的连续数字
  • r'\d+$':匹配字符串结尾的连续数字
  • 先替换末尾的2023为2024,再替换开头数字为对应number值

方法3:字符串切片拼接(性能最优)

针对首尾都是空格分隔数字的固定模式,提取中间部分后直接拼接:

# 提取第一个空格到最后一个空格之间的内容
middle_part = df['name'].str.extract(r'\s(.*)\s', expand=False)
# 拼接新的name字符串
df['name'] = df['number'].astype(str) + ' ' + middle_part + ' 2024'

原错误说明

df['name_pieces'].str[0] = df['number'] 报错是因为.str属性返回的是StringMethods对象,仅用于读取或链式操作,不支持直接赋值修改元素。需要通过apply或列表推导式等方式直接操作列表元素后再更新列值。

内容的提问来源于stack exchange,提问作者edge-case

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:01:30