如何在列表推导式中处理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
相关产品推荐
相关产品推荐

