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

如何在Pandas中从指定列提取字符串片段?代码问题排查

问题分析与解决:DataFrame循环赋值错误导致列值被覆盖

错误原因

你的代码核心问题是循环中直接给整列赋值,而非对应行的单元格:

for ict in df['ict_name']:
    if len(ict.split('-')) > 1:
        df['ict_state'] = ict.split('-')[1]  # 此处是给整列赋值,而非当前行
    else:
        df['ict_state'] = 'nan'

每次循环都会把df['ict_state']的所有行替换成当前循环元素的处理结果,最终整个列会被最后一次循环的结果(也就是最后一行的sp)完全覆盖,所以所有行的ict_state都变成了sp。

正确解法

推荐两种更高效、符合pandas风格的写法:

方法1:使用apply逐元素处理

通过apply对ict_name列的每个元素单独处理,避免整列覆盖:

import pandas as pd

matrix_entrada = [
    (1, 'ictX'),
    (2, 'ict - rio - estudos nucleares'),
    (3, 'ict - ba - laboratorio IA'),
    (4, 'ict132 - sp')]
df = pd.DataFrame(matrix_entrada, columns=['id', 'ict_name'])

# 用lambda函数处理每个字符串,strip()去除前后空格,无分隔符时返回pd.NA(规范的缺失值)
df['ict_state'] = df['ict_name'].apply(lambda x: x.split('-')[1].strip() if len(x.split('-')) > 1 else pd.NA)

print(df)

方法2:使用pandas字符串处理方法(更高效)

利用pandas内置的str方法链,专门处理字符串列,性能比循环/apply更好:

import pandas as pd

matrix_entrada = [
    (1, 'ictX'),
    (2, 'ict - rio - estudos nucleares'),
    (3, 'ict - ba - laboratorio IA'),
    (4, 'ict132 - sp')]
df = pd.DataFrame(matrix_entrada, columns=['id', 'ict_name'])

# 只分割第1个'-',取分割后的第二部分,再去除前后空格
df['ict_state'] = df['ict_name'].str.split('-', n=1).str[1].str.strip()

print(df)

正确输出

id                        ict_name ict_state
0   1                            ictX      <NA>
1   2  ict - rio - estudos nucleares       rio
2   3      ict - ba - laboratorio IA        ba
3   4                    ict132 - sp        sp

补充说明

  • 优先使用pandas的向量式操作(如str方法链),避免手动循环遍历DataFrame,既高效又能减少赋值错误。
  • 用pd.NA代替字符串'nan',符合pandas缺失值的规范,后续处理缺失值更方便。

内容的提问来源于stack exchange,提问作者Barbara Bressan Rocha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:41:13