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

如何在列表推导式中处理DataFrame列的字符串拆分及非字符串值问题?

解决Pandas中拆分字符串时的AttributeError问题

问题背景

先看我们要处理的DataFrame:

import pandas as pd
import numpy as np

d1 = {'atom_number': ["12,14,24",  "23", "14,25,46", 20.3 , np.nan,  "15,24"]}
df = pd.DataFrame(data=d1)

初始DataFrame输出:

atom_number
0   12,14,24
1   23
2   14,25,46
3   20.3
4   NaN
5   15,24

尝试用列表推导式拆分字符串时触发报错:

df['atom_number'] = [[int(x) if type(s) == str else np.nan for x in s.split(',')] for s in df.atom_number] 
df = df.dropna(subset = ["atom_number"])

错误信息:

AttributeError: 'float' object has no attribute 'split'

我们的目标输出:

atom_number
0   [12, 14, 24]
1   [23]
2   [14, 25, 46]
3   [15, 24]

要求直接在列表推导式中完成处理,无需先过滤DataFrame。


解决方案:修正列表推导式的判断逻辑

原代码的问题在于:还没判断元素类型就先调用了s.split(','),非字符串类型(比如float、NaN)没有split方法,因此触发报错。我们需要先判断元素类型,再执行对应处理逻辑:

df['atom_number'] = [
    [int(x) for x in s.split(',')] if isinstance(s, str) 
    else np.nan 
    for s in df['atom_number']
]
# 过滤NaN行并重置索引
df = df.dropna(subset=["atom_number"]).reset_index(drop=True)

逻辑说明

  • 对每个元素s,先通过isinstance(s, str)判断是否为字符串:
    • 是字符串:按逗号拆分后,将每个子元素转为整数并组成列表
    • 不是字符串(比如20.3、NaN):直接赋值为np.nan,方便后续过滤
  • 最后用dropna删除值为NaN的行,reset_index重置索引以匹配期望格式

执行后即可得到目标输出。


内容的提问来源于stack exchange,提问作者Limmi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:20:51