如何修改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
相关产品推荐
相关产品推荐

